自动事务

来源:互联网 发布:淘宝订单清洗了会影响 编辑:程序博客网 时间:2024/04/28 04:25

自动事务和 ASP.NET

在 ASP.NET 页中插入事务指令,您可以指示该页参与现有事务、开始新事务或永不参与事务。

下表列出并描述 ASP.NET 中可用的事务指令。

Disabled 指示 ASP.NET 将忽略事务上下文。这是默认的事务状态。 NotSupported 指示该页不在事务范围内运行。处理请求后,不管是否有活动事务,均在没有事务的情况下创建其对象上下文。 Supported 指示该页在现有事务的上下文中运行。如果没有事务,则该页在没有事务的情况下运行。 Required 该页在现有事务的上下文中运行。如果没有事务,则该页将启动一个事务。 RequiresNew 指示该页需要事务且为每个请求启动新事务。

<%@ Page Transaction="Required" %>

 

自动事务和 XML Web services 

可使用 WebMethodAttribute 属性类的 TransactionOption 属性声明一个自动事务。

[ WebMethod(TransactionOption=TransactionOption.RequiresNew)]
     public int DeleteAuthor(string lastName) 
     {
       String deleteCmd = "DELETE FROM authors2 where au_lname='" + lastName + "'" ;
   
         SqlConnection sqlConn = new SqlConnection("Integrated Security=SSPI;database=pubs;server=myserver");
         SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn);

         myCommand.Connection.Open();
      return myCommand.ExecuteNonQuery();
     }

自动事务中的投票 

.NET Framework 类和 ASP.NET 页可以通过投票来提交或中止它们的当前事务。默认情况下,如果代码中没有显式投票,则默认为赞成提交。但默认提交可能会延长为每个事务释放昂贵资源所用的时间,从而可能降低应用程序的性能。

显式投票还允许类或页在遇到严重错误时中止事务。

使用自动完成

System.EnterpriseServices.AutoCompleteAttribute 使参与事务的对象投票赞成在方法正常返回时完成事务。如果方法调用引发异常,则中止事务。只能将此特性应用于从 ServicedComponent 类派生的类。

[Transaction(TransactionOption.Supported)]
public class Account : ServicedComponent {
    [AutoComplete]
    public void Debit(int amount) {
        // Do some database work. Any exception thrown here aborts the transaction;
        // otherwise, transaction commits.
    }
}

使用 SetAbort 和 SetComplete

可以使用公开 SetCompleteSetAbort 方法的 System.EnterpriseServices.ContextUtil 类来显式提交或中止事务。SetComplete 指示对象投票赞成提交其工作;SetAbort 指示对象遇到了问题且投票赞成中止正在进行的事务。直到事务的根对象停用,才提交或中止事务。此外,任何参与事务的对象中有一个中止投票,都将导致整个事务失败。

if( !DoSomeWork() )
{
  //Something goes wrong.
  ContextUtil.SetAbort();
}
else
{
  //All goes well.
  ContextUtil.SetComplete();
}