System.Transactions 命名空間讓交易處理比以往任何技術都簡單。只需參考 System.Transactions.dll,將交易性代碼包裹在 using 區塊中建立 TransactionScope,最後呼叫 Complete()。若發生例外,using 區塊結束時會自動釋放並回滾交易。
TransactionScope 實例化後會建立「目前交易」(ambient transaction)。任何資源管理器(如 SqlConnection)在開啟連線時,若連線字串 auto-enlist=true(預設),會自動加入該交易範圍。可透過 Transaction.Current 檢查是否存在目前交易。
透過 TransactionOptions 可調整隔離等級(預設 Serializable)與逾時時間(預設 1 分鐘)。TransactionScope 有多個建構函式多載,支援 TransactionScopeOption 列舉:
若 TransactionScope 未正確釋放,交易會保持開啟直到垃圾回收或逾時,鎖定資源。務必使用 using 或 try/finally 確保及時釋放。離開 using 區塊時會呼叫 Dispose,若已呼叫 Complete() 則提交,否則回滾。
輕量級交易 不使用 Microsoft DTC(分散式交易協調器),僅在本機資源管理器(如 SQL Server 2005+)運作。當涉及第二個資源管理器時,才升級為分散式交易(需 DTC)。SQL Server 2000 不支援輕量級交易,所有交易皆升級為 DTC。
何時使用 System.Transactions?
SqlTransaction)效率更高,因不需 DTC。巢狀方法中,內層 TransactionScope 的 TransactionScopeOption 決定行為:
Required:加入外層交易,所有範圍必須皆呼叫 Complete() 才會提交。RequiresNew:建立獨立交易,與外層無關。Suppress:在無交易環境下執行。