.net 事務處理的三種方法

方法1:直接寫入到sql 中web

在存儲過程當中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現sql

begin trans數據庫

declare
@orderDetailsError int,
@procuntError int服務器

delete from [order details] where productid=42
select @orderDetailsError =@@error
delete from products where productid=42
select @procuntError=@@error分佈式

if(@orderDetailsError =0 and @procuntError=0)
COMMIT TRANS
else
ROLLBACK TRANS性能

點:
全部事務邏輯包含在一個單獨的調用中
擁有運行一個事務的最佳性能
獨立於應用程序
限制:
事務上下文僅存在於數據庫調用中
數據庫代碼與數據庫系統有關
ui


方法2 :使用ADO.NET 實現 spa

使用ADO.NET 實現,使用這種方式的優勢是能夠在中間層來管理事務,固然你也能夠選擇在數據層來實現。
SqlConnection 和OleDbConnection 對象有一個 BeginTransaction 方法,它能夠返回 SqlTransaction
或者OleDbTransaction 對象。並且這個對象有 Commit 和 Rollback 方法來管理事務
對象

SqlConnection sqlConnection = new SqlConnection("workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False");
   sqlConnection.Open();
   SqlTransaction myTrans = sqlConnection.BeginTransaction();
   SqlCommand sqlInsertCommand = new SqlCommand();
   sqlInsertCommand.Connection = sqlConnection
   sqlInsertCommand.Transaction=myTrans;
   try{
       sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('北京',1)";
       sqlInsertCommand.ExecuteNonQuery();
       sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('上海',1)";
       sqlInsertCommand.ExecuteNonQuery();
       myTrans.Commit();
     }catch(Exception ex)
     {
      myTrans.Rollback();
     }
    finally
    {
     sqlConnection.Close();
    }blog

優勢:
     簡單性
     和數據據事務差很少的快
     獨立於數據庫,不一樣數據庫的專有代碼被隱藏了
缺點:
     事務不能跨越多個數據庫鏈接
     事務執行在數據庫鏈接層上,因此須要在事務過程當中維護一個數據庫鏈接

     ADO.NET分佈事務也能夠跨越多個數據庫,可是其中一個SQL SERVER 數據庫的話,經過用SQL SERVER鏈接服務器鏈接到別的數據庫,可是若是是在DB2和Orcal之間就不能夠。


以上兩種事務是常常用到的事務處理方法。

方法3 COM+事務(分佈式事務)

.NET Framework 依靠 MTS/COM+ 服務來支持自動事務。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 做爲事務管理器和事務協調器在分佈式環境中運行事務。這樣可以使.NET 應用程序運行跨多個資源結合不一樣操做(例如,將定單插入 SQL Server 數據庫、將消息寫入 Microsoft 消息隊列(MSMQ) 隊列、以及從 Oracle 數據庫檢索數據)的事務。


   COM+事務處理的類必須繼承System.EnterpriseServices.ServicedComponent,其實web service就是繼承System.EnterpriseServices.ServicedComponent,因此web service也支持COM+事務。

定義一個COM+事務處理的類
[Transaction(TransactionOption.Required)]
public class DataAccess:System.EnterpriseServices.ServicedComponent
{}
TransactionOption枚舉類型支持5個COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)
Disabled      忽略當前上下文中的任何事務。
NotSupported 使用非受控事務在上下文中建立組件。
Required      若是事務存在則共享事務,而且若有必要則建立新事務。
RequiresNew   使用新事務建立組件,而與當前上下文的狀態無關。
Supported     若是事務存在,則共享該事務。
通常來講COM+中的組件須要Required 或Supported。當組件用於記錄或查賬時RequiresNew 頗有用,由於組件應該與活動中其餘事務處理的提交或回滾隔離開來。
派生類能夠重載基類的任意屬性。如DataAccess選用Required,派生類仍然能夠重載並指定RequiresNew或其餘值。

COM+事務有手動處理和自動處理,自動處理就是在所須要自動處理的方法前加上[AutoComplete],根據方法的正常或拋出異常決定提交或回滾。
手動處理就是調用ContextUtil類中EnableCommit,SetComplete,SetAbort方法。

   public string testTransaction()
{
   try
   {
    ContextUtil.EnableCommit();
    InsertARecord1();
    InsertARecord2();
     ContextUtil.SetComplete();
    return "succeed!";
   }
   catch(Exception ex)
   {
           ContextUtil.SetAbort();
           return "failed!";
   }
}
      public void InsertARecord1()
{   
    string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
    SqlConnection conn=new SqlConnection(strconn);
    conn.Open();
    SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('北京',1)",conn);
    command.ExecuteNonQuery();
    conn.Close();
}
        public void InsertARecord2()
{
    string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";
    SqlConnection conn=new SqlConnection(strconn);
    conn.Open();
    SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('上海',1)",conn);
    command.ExecuteNonQuery();
    conn.Close();
}
在須要事務跨 MSMQ 和其餘可識別事務的資源(例如,SQL Server 數據庫)運行的系統中,只能使用 DTC 或 COM+ 事務,除此以外沒有其餘選擇。DTC 協調參與分佈式事務的全部資源管理器,也管理與事務相關的操做。


缺點:
因爲存在 DTC 和 COM 互操做性開銷,致使性能下降。COM+事務處理的類必須強命名。

相關文章
相關標籤/搜索