事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下三種總結整理如下:方法1:直接寫入到sql 中在存儲過程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現begin transdeclare @orderDetailsError int,@PRocuntError intdelete from [order details] where productid=42select @orderDetailsError=@@errordelete from products where productid=42select @procuntError=@@errorif(@orderDetailsError =0 and @procuntError=0)COMMIT TRANSelseROLLBACK TRANS優點: 所有事務邏輯包含在一個單獨的調用中 擁有運行一個事務的最佳性能 獨立于應用程序限制: 事務上下文僅存在于數據庫調用中 數據庫代碼與數據庫系統有關方法2 :使用ADO.Net 實現使用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(); }優點: 簡單性 和數據據事務差不多的快 獨立于數據庫,不同數據庫的專有代碼被隱藏了缺點: 事務不能跨越多個數據庫連接 事務執行在數據庫連接層上,所以需要在事務過程中維護一個數據庫連接 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+事務處理的類必須強命名。
文章引用自:
新聞熱點
疑難解答