天天看點

.NET 事務處理總結

事務處理是在資料處理時經常遇到的問題,經常用到的方法有以下3種總結整理如下: 方法1:直接寫入到sql 中 在存儲過程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實作

.NET 事務處理總結

優點:事務邏輯包含在一個單獨的調用中,有運作一個事務的最佳性能,立于應用程式。限制: 事務上下文僅存在于資料庫調用中,資料庫代碼與資料庫系統有關。

方法2 :使用ADO.NET 實作

使用ADO.NET 實作,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在資料層來實作。 SqlConnection 和OleDbConnection  對象有一個 BeginTransaction 方法,它可以傳回 SqlTransaction 或者OleDbTransaction 對象。而且這個對象有 Commit 和 Rollback 方法來管理事務,本例為更新資料庫中某張表的一個示例。

.NET 事務處理總結

優點:      簡單性      和資料據事務差不多的快      獨立于資料庫,不同資料庫的專有代碼被隐藏了 缺點:      事務不能跨越多個資料庫連接配接      事務執行在資料庫連接配接層上,是以需要在事務過程中維護一個資料庫連接配接      ADO.NET分布事務也可以跨越多個資料庫,但是其中一個SQL SERVER 資料庫的話,通過用SQL SERVER連接配接伺服器連接配接到别的資料庫,但是如果是在DB2和Orcal之間就不可以。以上兩種事務是經常用到的事務處理方法。

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

.NET Framework 依靠 MTS/COM+ 服務來支援自動事務。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作為事務管理器和事務協調器在分布式環境中運作事務。這樣可使 .NET 應用程式運作跨多個資源結合不同操作     定義一個COM+事務處理的類  TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)  TransactionOption枚舉類型支援5個COM+值(Disabled,NotSupported,Required,RequiresNew,Supported) Disabled      忽略目前上下文中的任何事務。 NotSupported  使用非受控事務在上下文中建立元件。 Required      如果事務存在則共享事務,并且如有必要則建立新事務。 RequiresNew   使用新事務建立元件,而與目前上下文的狀态無關。 Supported     如果事務存在,則共享該事務。 一般來說COM+中的元件需要Required 或Supported。當元件用于記錄或查帳時RequiresNew 很有用,因為元件應該與活動中其他事務處理的送出或復原隔離開來。

 以下是COM+事務處理的一個示例:  

.NET 事務處理總結
.NET 事務處理總結
.NET 事務處理總結

//使用以上COM+事務,必須啟動控制台中管理工具中服務的MS DTC(Distributed Transaction Coordinator)首先我們要明白什麼是分布式事務,如果所有資料的修改僅依靠單個資料源就能完成,則這個事務就相當簡單了。然而,随着商業需求的日益增加,應用程式變得越來越複雜,經常需要通路多個資料庫,這些資料庫通常分布在不同的地方,這就是分布式事務。而COM+正好滿足了我們的需求,我們仍然以上面的示例做說明,如果上面示例的兩個測試方法中連接配接字元串分别連接配接的是不同的兩個資料庫,那麼當修改其中一個資料庫時另一個資料庫也将被修改,但是事務中的每個資料源必須裝有MS DTC,MSDTC最先內建在SQL Server中,現在已成為COM+必不可少的部分,通過在事務進行中加入其他的因子,MS DTC确認所有的過程完成并送出他們。MS DTC支援使用XA協定的資料庫,XA協定是一種兩階段執行的協定,由SQL Server和Oracle支援。單個事務處理可以把資料寫到SQL Server和Oracle資料庫上。讓我們進一步研究MS DTC,了解其工作方式。為了能用兩階段送出協定進行協調,事務中的每個資料源必須裝有MS DTC。在這些安裝中,主要的協調器總是在事務的起源之處。這個主要的協調器稱為送出協調器,它負責確定事務的送出或終止。不管事務是成功地送出還是復原,送出協調器都負責向客戶應用程式傳回一個報告。分布式事務處理不僅對資料庫有用,而且單個事務處理還可以把資料寫到資料庫和消息隊列上,如果這兩個操作中的一個失敗,另一個操作就會復原。消息隊列簡介: 消息隊列技術是分布式應用中交換資訊的一種技術。消息隊列可駐留在記憶體或磁盤上,隊列存儲消息直到它們被應用程式讀走。通過消息隊列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此消息。 在分布式計算環境中,為了內建分布式應用,開發者需要對異構網絡環境下的分布式應用提供有效的通信手段。為了管理需要共享的資訊,對應用提供公共的資訊交換機制是重要的。

COM+的手動事務處理和自動事務處理: 如下圖所示為确定使用手動事務處理還是自動事務處理的方法。由于 COM+ 事務處理的系統開銷,建議将事務處理放到資料庫中并在存儲過程中控制事務性行為(如果可能)。

.NET 事務處理總結

雖然 COM+ 事務處理會帶來一些系統開銷,但自動事務處理能夠提供比手動事務處理更簡單的程式設計模式,而且在事務處理跨多個分布式資料源(與 DTC 一起工作)時必須使用自動事務處理。在資料通路邏輯元件中實作自動事務處理時,請考慮以下建議: • 資料通路邏輯元件必須是從 System.EnterpriseServices 命名空間中的 ServicedComponent 類繼承而來。注意,使用 COM+ 服務注冊的所有程式集都必須具有嚴格的名稱。 • 使用 Transaction(TransactionOption.Supported) 屬性注釋資料通路邏輯元件,以便可以在同一元件中執行讀寫操作。與 Transaction(TransactionOption.Required) 不同,此選項在不需要事務處理時避免了不必要的系統開銷,而前者始終會要求事務處理。 以下代碼示例顯示了如何在資料通路邏輯元件類中支援自動事務處理 using System.EnterpriseServices;    [Transaction(TransactionOption.Supported)] public class CustomerDALC : ServicedComponent {       //... } 如果使用自動事務處理,則資料通路邏輯元件應在事務進行中表明操作是否成功。如果要隐式表明,應使用 AutoComplete 屬性注釋您的方法并在操作失敗時發出一個異常。如果要顯式表明,應對 ContextUtil 類調用 SetComplete 或 SetAbort 方法。 以下是一個具體自動事務的示例:

.NET 事務處理總結

具體的調用:

.NET 事務處理總結

如果方法體沒有[AutoComplete]屬性,按以下方式調用: