使用TransactionScope類
正如名稱所暗示,TransactionScope類用於限定事務代碼塊,其具有一些明顯優點,例如范圍與應用程序對象模型無關,同時提供了一個簡單直觀的編程模型等等。在該類的構造函數內部,TransactionScope對象創建了一個事務(.NET 2.0中默認時輕量級事務管理器),同時將該事務設置給Transaction類的Current屬性。由於TransactionScope是可釋放對象,所以事務將調用Dispose()方法釋放該對象:
using(TransactionScope scope = new TransactionScope()) |
示例2列舉了一種在.NET 2.0中創建事務的方法。在TransactionScope對象定義的代碼塊中創建和釋放該對象。使用TransactionScope對象的構造函數和TransactionScopeOption枚舉,開發人員能夠定義是否需要新事務,或者是否應該使用已經在外部塊中存在的事務。TransactionScope.Complete()方法指示事務范圍內的所有操作都已成功完成。在using語句結尾處(調用Dispose()方法的位置),定義了事務塊的輸出。如果由於發生異常而沒有調用Complete()方法,那么放棄事務。如果在事務范圍內成功完成,則如果事務是根事務,那么當事務是根事務時就提交事務。如果范圍內的不是根事務,那么會影響事務輸出。
例2:使用TransactionScope實現隱式事務
<%@ Page Language="C#" %> |
以下是TransactionScope所完成的一些內容:
出現在using語句括號中的任何語句將在事務范圍內執行。
任何在塊中創建的連接將在事務中登記。
如果在using塊中發生錯誤,則事務將自動回滾。
如果語句成功執行,那么作為工作的一部分,需要在事務中調用Complete()方法。
調用堆棧的每一步必須調用Complete(),以便提交事務。
TransactionScope對象無法了解是否應該提交或者放棄事務,TransactionScope的主要目標是避免開發人員與事務直接交互。為了解決這個問題,每個TransactionScope對象都有一個一致性位,其默認設置為false。通過調用Complete()方法能夠將一致性位設置為true。注意,只能調用一次Complete()。后續對Complete()的調用將引發InvalidOperation異常,因為在調用Complete()之后,不能保證還有事務性代碼。
ASP.NET中的自動化事務
通過在ASP.NET頁面中添加Transaction屬性,可使得ASP.NET能夠在系統中支持自動事務。利用Transaction屬性,開發人員能夠指示頁面參與現有事務,開始新事務,或者不參與事務。下表列舉了ASP.NET中可用的Transaction屬性值。
圖片部分的源代碼:
![]() |
圖1 |
事例:
using (TransactionScope tsCope = new TransactionScope()) { var sailorLetterApplyForm = _sailorLetterApplyFormRepository.Get(Id); if (sailorLetterApplyForm != null) { _sailorLetterApplyFormRepository.Remove(sailorLetterApplyForm); _sailorLetterApplyFormRepository.UnitOfWork.Commit(); } else LoggerFactory.CreateLog().LogWarning("不能刪除不存在的證書申請"); tsCope.Complete(); }