WCF 事務機制建立在 System.Transactions 之上,支援本地與分散式事務。分散式事務仰賴 MSDTC (Microsoft Distributed Transaction Coordinator) 協調跨服務、跨資料庫的兩階段提交 (2PC)。
| 協定 | 傳輸 | 跨防火牆 | 異構平台 | 適用綁定 |
|---|---|---|---|---|
| Lightweight | AppDomain 內 | 否 | 否 | 無預設綁定支援 |
| OleTx | RPC / 二進位 | 否 | 否 | NetTcpBinding, NetNamedPipeBinding |
| WS-AtomicTransaction (WS-AT) | HTTP / XML | 是 | 是 | WSHttpBinding, WSDualHttpBinding 等 |
設定範例:<binding transactionFlow="true" transactionProtocol="WSAtomicTransactionOctober2004" />
當事務跨越服務邊界或涉及多個持久資源,會自動從 LTM 提升至 DTC。
| 模式 | Binding transactionFlow | Operation TransactionFlow | OperationBehavior |
|---|---|---|---|
| Client/Service 共同參與 (最常用) | true | Allowed | TransactionScopeRequired=true |
| 強制 Client 發起 | true | Mandatory | TransactionScopeRequired=true |
| Service 獨立事務 | false | NotAllowed | TransactionScopeRequired=true |
[ServiceBehavior(TransactionTimeout = "00:30:00", InstanceContextMode = InstanceContextMode.PerCall)]
public class WCFService : IWCFService
{
[OperationBehavior(TransactionScopeRequired = true)]
[TransactionFlow(TransactionFlowOption.Allowed)]
public bool AddData(string name)
{
using (var scope = new TransactionScope())
{
try
{
// DB 操作
if (name.Length > 8) throw new Exception("名稱過長");
scope.Complete(); // 提交
return true;
}
catch
{
// 自動回滾 (或 Transaction.Current.Rollback())
return false;
}
}
}
}
TransactionScope 預設隔離級別為 Serializable,高併發下易造成死鎖,可考慮 TransactionScopeOption.RequiresNew 或調整隔離級別。WCF 透過標準化協定 (WS-AT) 與 Windows 基礎設施 (MSDTC) 實現強一致性分散式事務。正確選擇協定、配置事務流屬性、處理提升邏輯,是建置可靠分散式系統的關鍵。