本文將帶您深入了解 WCF 中事務的實作機制,涵蓋核心屬性設定、事務隔離等級、常見開發阻力與解決方案、分布式事務原理,並以銀行存提款實戰範例完整演示。適合已具備 WCF 基礎概念的開發人員閱讀。
WCF 將複雜的事務管理簡化為聲明式屬性配置,主要涉及以下五大核心屬性:
標記於 OperationContract 上,控制操作是否允許事務流動。其建構函式參數為 TransactionFlowOption 列舉:
| 屬性名稱 | 功能說明 | 關鍵提示 |
|---|---|---|
| TransactionAutoCompleteOnSessionClose | 事務完成後是否自動釋放服務實例 | 預設 true,會強制銷毀實例(即使 PerSession/Single 模式),若需保持實例壽命請設為 false |
| TransactionIsolationLevel | 指定事務隔離等級 | 支援 Any、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable 五種 |
| TransactionTimeout | 事務超時時間 | 預設 TimeSpan.Zero(無限制) |
| TransactionScopeRequired | 是否必須在 TransactionScope 內執行 | 設為 true 時,呼叫端必須包裹在事務範圍中 |
資料庫事務面臨三大經典併發問題:
| 隔離等級 | 髒讀 | 不可重複讀 | 幻讀 | 備註 |
|---|---|---|---|---|
| ReadUncommitted | ✓ | ✓ | ✓ | 最低隔離,僅防止讀取物理損壞數據 |
| ReadCommitted | ✗ | ✓ | ✓ | 預設等級,讀取已提交數據 |
| RepeatableRead | ✗ | ✗ | ✓ | 鎖定查詢範圍數據,防止修改但不防新增 |
| Serializable | ✗ | ✗ | ✗ | 最高隔離,完全串列化執行 |
| Any | - | - | - | 繼承上層隔離等級,無上層則退化為 Serializable |
選擇建議:隔離等級越高,併發性能越低。實務上多採用 ReadCommitted 平衡一致性與效能。
錯誤提示:「協定上至少有一個操作配置為將 TransactionFlowAttribute 屬性設置為『強制』,但是通道的綁定未使用 TransactionFlowBindingElement 進行配置。」
解決:在繫結配置中加入 <transactionFlow /> 元素,或使用支援事務流的繫結(如 NetTcpBinding、WSHttpBinding 並啟用 transactionFlow="true")。
錯誤提示:「服務操作需要事務成為流」
解決:呼叫端必須使用 TransactionScope 包裹服務呼叫,確保事務上下文正確傳遞。
預設 TransactionAutoCompleteOnSessionClose="true" 會在事務完成後強制呼叫 Dispose() 銷毀服務實例,完全無視 InstanceContextMode 設定(即使 Single/PerSession)。


對策:明確設定 [OperationBehavior(TransactionAutoCompleteOnSessionClose = false)] 以保持實例生命週期。
跨服務事務必須在客戶端建立 TransactionScope 範圍,確保多個服務操作在同一事務中原子提交或回滾。
WCF 分布式事務基於 WS-AtomicTransaction (WS-AT) 標準實現,屬於進階內幕範疇。核心機制包含:
深度探討請參考 Kevin Li 系列文章:
架構設計:
業務流程:
關鍵驗證點:當取款金額超過餘額時,系統拋出異常,帳戶餘額不變更,證明事務回滾生效。

WCF 透過聲明式屬性極大降低了分布式事務的實作門檻,但開發者必須理解:
TransactionAutoCompleteOnSessionClose 對實例生命週期的「核彈級」影響TransactionScope 使用掌握這些核心機制,才能在實際專案中游刃有餘地駕馭 WCF 事務。