天天看點

C#綜合揭秘——細說事務(下)

目錄

<a href="http://79100812.blog.51cto.com/2689556/841431#t1">一、事務的定義</a>

<a href="http://79100812.blog.51cto.com/2689556/841431#t2">二、事務管理器</a>

<a href="http://79100812.blog.51cto.com/2689556/841431#t3">三、在ADO.NET中實作事務</a>

<a href="http://79100812.blog.51cto.com/2689556/841452#t4">四、隐式事務 TransactionScope</a>

<a href="http://79100812.blog.51cto.com/2689556/841452#t5">五、在WCF中實作事務</a>

<a href="http://79100812.blog.51cto.com/2689556/841475#t6">六、嵌套式事務</a>

<a href="http://79100812.blog.51cto.com/2689556/841475#t7">七、異步事務</a>

<a></a>

六、嵌套式事務

嵌套式事務經常會出現在項目中,但往往容易被大家忽略,下面介紹一下 嵌套式事務的用法:

一 般項目中,大家都隻會把事務用在DAL層,用于管理資料的CRUD,但其實在一些操作中,某些資料的操作必須具有一緻性。比如在訂單管理中,當插入一條 OrderItem時,Order表内的總體價格,商品數量等也會随之改變。很多人把兩個表的操作合成一個方法,放在OrderDAL中完成。但其實這樣 做違返設計的原則,因為計算Order的總體價格時可能會包含商品優惠、客戶等級、客戶積分等等業務邏輯,而在DAL層不應該包含任何的業務邏輯存在的, 是以這樣操作應該放在業務層完成。這時候,業務層的方法内就需要同時調用OrderItemDAL的AddOrderItem(OrderItem) 方法和OrderDAL的UpdateOrder(Order)方法,為了保證資料的一緻性更新,就需要使用嵌套式事務。但這往往容易被開發人員所忽略, 當Order表的更新成功而OrderItem表的插入失敗時,系統不能保證資料的同步復原,那就會造成資料的邏輯性錯誤。

下面的例子就是為了保證資料一緻性更新而使用的嵌套式事務,在使用嵌套式事務的時候要應該注意及其把對象釋放,避免做成死鎖。

<a href="http://79100812.blog.51cto.com/2689556/841475#t0">回到目錄</a>

七、異步事務

記得在第二節的時候曾經提起過事務類Transaction的方法中包含方法

public DependentTransaction DependentClone(DependentCloneOption)

此方法作用是克隆目前的事務,它在多線程調用同一事務的情況下使用經常使用。其中DependentCloneOption包含有兩個選項:

一為BlockCommitUntilComplete,這表示在依賴事務未完成前,事務将處于阻塞狀态,隻有在所有依賴事務完成後,事務才能執行送出;

二為RollbackInNotComplete,這表示依賴事務必須在事務完成前調用Complete(),否則事務會被視為失敗。

在 普通情況下,事務都會通過Transaction.Current 來擷取,但此方法隻能擷取目前線程下的事務對象,在異步方法當中,這隻會傳回一個空值 null 。此時就需要使用DependentClone 方法擷取依賴事務對象 DependentTransaction ,再把此對象作為參數傳遞到回調函數中。

首 先在主線程中利用 Transaction.DependentClone(DependentCloneOption.BlockCommitUntilComplete) 方法生成一個依賴事務,注意方法使用了BlockCommitUntilComplete的方式生成,即事務将在所有依賴事務使用Complete()後 才能執行送出。

然後利用ThreadPool.QueueUserWorkItem(WaitCallback,Object)方法把依賴事務作為回調參數傳遞到回調函數中。

最後在回調函數中使用TransactionScope(transaction)構造函數生成對象,這代表把參數transaction作為目前的環境事務對象。觀察下面的運作結果,兩個線程中的事務都是同一個事務。

<a target="_blank" href="http://blog.51cto.com/attachment/201204/231545679.jpg"></a>

結束語

事務是在多個層次都會使用到的,但很多項目當中往往會忽略了這一點而隻在資料層使用,在大型的系統當中這樣可能會影響到系統的一緻性。特别是在分布式系統當中,操作往往同時存在于多個不同的系統當中,事務的處理更顯示出其重要性。

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

本文轉自 leslies2  51CTO部落格,原文連結:http://blog.51cto.com/79100812/841475