今天這篇文章我們将使用.NET C#來進行事務性程式設計,從淺顯、簡單的本地事務開始,也就是我們用的最多的ADO.NET事務處理,然後我們逐漸擴大事務處理範圍,包括對分布式事務處理的使用,多線程事務處理的使用。
資料庫事務處理
資料庫事務處理我們基本都很熟悉了,begin Transaction ……end Transaction,将要進行事務性的操作包在代碼段裡,為了便于文章有條理的講解下去,我還是在這裡穿插一個簡單的小示例,便于與後面的代碼進行對比分析。
例1:
我們在資料庫裡建兩張表,也就是很簡單一列資訊。
表1名:test
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnaukzN4MmZ2YDM0UmYhhzNlF2YxMjM2YjZ0cTMxQzY4cTNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
表2名:test2
目的是為了掩飾事務的特性,是以我們這裡給表1test的name列設定為主鍵,我們後面将通過有意的造成主鍵重複,導緻事務自動復原的效果。
我先來解釋一下這兩張表後面幹什麼用的。表test是用來有意造成事務内部處理出錯用的,表test2是用來在事務處理當中扮演着沒有錯誤的正常資料插入用的,我會在test2中先插入資料,然後在test中插入資料時觸發事務内部執行錯誤導緻事務復原。
好了我們進行T-SQL的編寫:
我們運作看看結果:
在事務處理過程中,很明顯第一條插入語句執行成功了,但是由于第二條插入語句導緻事務復原是以資料是沒有變化的。
這個示例可能過于簡單,真正的企業級應用可能很複雜,但是我們的目的是看看事務的使用,越簡單越明了越好。[王清培版權所有,轉載請給出署名]
ADO.NET事務處理
下面我們将事務在.NET的AOD.NET中實作看看效果。
例2:
這就是典型ADO.NET事務處理代碼,其實和我們第一個例子中的T-SQL代碼是差不多的,通過ADO.NET中的SqlConnection.BeginTransaction()擷取到對底層ODBC中的資料庫事務的引用,其實這裡還沒有真正的設計到.NET中的事務處理代碼,這裡隻是對資料庫管理系統的遠端調用,通過遠端處理的消息通訊進行事務處理遠端化。
事務資訊顯示類,為了便于觀察事務的狀态資訊。
CommittableTransaction事務處理
從這裡開始我們将接觸到.NET中的事務處理,将了解到.NET中事務是怎樣影響到遠端資料庫管理系統的事務處理的。
其實事務處理是一個非常複雜的技術領域,需要考慮很多可逆的技術實作,我們隻是簡單的了解原理和掌握基本的運用。
接着上面的執行個體,我們現在通過.NET中的事務處理來進行自動化的資料庫事務處理。讓資料庫能自動的感覺到我們正在進行事務性的操作。
例3:
我們利用Transaction類的子類CommittableTransaction可送出事務類來進行事務程式設計。
資料源連接配接對象代表着遠端資料庫資源,是以在執行操作之前我們需要将資料總管添加到本地事務管理器中進行後期的投票、送出管理。
EnterpriseService(COM+)自動化事務處理
在.NET2.0中有一個程式集不是太被人重視,System.EnterpriseServices.dll,這個程式集是.NET中為了使用早起的COM+技術的托管程式集,我們可以使用這個程式集來編寫一些我們以前所不能編寫的COM+應用程式。至于COM+應用程式的介紹網上一大堆,随便搜搜就有好多資料了,我印象中有一篇是潘愛明潘老師寫的一個文章蠻好的,就是介紹COM+的所有特性。
我們繼續來事務處理,下面我們看看怎麼借用System.EnterpriseServices.Transaction類來進行自動化的事務處理。
例4:
DependentTransaction跨線程事務處理
我們在編寫高并發量程式時,都會用到多線程來進行處理,讓主線程能有時間來處理第一線的請求,然後将請求分發到各個子線程上進行背景的處理。我們來看一幅圖:
我們假設上面這幅圖是我們系統的一個内部結構,主線程主要的任務就是接受外來的請求,然後将具體的任務完成放到一個到兩個子線程中去完成,但是子線程與子線程之間沒有必然的關系,由于事務的上下文是不誇線程的,那麼怎麼将兩個或者更多的線程串在一個事務裡。[王清培版權所有,轉載請給出署名]
我們來看看依賴事務處理,看代碼:
例5:
我們用一個子線程來執行另外的一個事務處理,由于是依賴事務處理,是以主事務處理完成後要等待子事務處理的結果。其實本例子已經是涉及到分布式事務處理的範圍了,當事務範圍内有一個以上的資料總管時,本地事務管理器将自動提升為DTC管理器,下面我們來看看分布式事務處理。
DTC(Distributed Transaction Coordinator) 分布式事務處理
分布式事務在開發中經常是被用到,也必須被用到。必須同步資料、上下文更新等等。
按照使用方式的不同分布式事務的複雜程度也不同,基于本地事務的多資料總管和基于SOA的面向服務的多資料總管。
由于本地事務處理是基于本地事務管理器的,是以它不能管理分布式的事務,一旦當我們處理的事務範圍要進行擴大時并且是誇機器的通路時,那麼本地事務管理器将自動提升為分布式事務管理器也就是DTC(分布式事務協調器)。
例6:
一旦我們開啟分布式事務處理就能在我們的電腦上的DTC管理器上看見到。
但是要記得檢查你的DTC服務是否開啟了。
基于WCF架構的分布式事務處理
其實基于WCF架構進行分布式事務開發真的很輕松,它能很好的感覺到目前上下文是不是事務域,并能很好的将事務序列化到服務這邊來。但是設計一個高性能的分布式事務處理架構并非易事,需要很長時間的積累和實踐。我們來看一下WCF是如果進行分布式事務處理的。
例7:
服務配置:
Binding配置:
我們需要打開Binding的事務流傳遞。
用戶端代碼:
用戶端使用TransactionScope類來進行環境事務的設定,這樣就很友善知道事務的執行範圍,在TransactionScope裡面我們可以通過Transaction.Current擷取到目前上下文的事務對象,由于事務對象是存儲線上程獨立存儲區裡的,是以跨線程通路是沒用的,通過依賴事務進行傳遞。[王清培版權所有,轉載請給出署名]
文章到這裡就講完了,從本地事務、多資料總管分布式事務、SOA結構的分布式事務,我們都能進行基本的掌握。上面的例子都是經過嚴格測試的。