承上篇,當本地事務(LTM/KTM)提升為 DTC 管理的分散式事務後,DTC 成為本機所有資源管理器的管理者;跨機器呼叫時,雙方 DTC 透過協議協作。所有參與者(資源管理器、DTC)經由事務登記形成樹狀的事務提交樹,這是後續提交協定運作的基礎。
登記流程如圖 1 所示:服務 A 起始事務,本機資源管理器向本機 DTC 登記;呼叫服務 B 時,事務資訊(分散式事務 ID、DTC 端點)隨訊息傳播,服務 B 重建事務並讓其本機 DTC 向服務 A 的 DTC 登記,形成上下級關係;服務 B 的資源管理器同樣向本機 DTC 登記。最終形成圖 2 的樹狀結構:根節點為起始端 DTC(全域提交協調器 GCC),葉節點為資源管理器,中間節點為各機器 DTC。
分散式事務提交採 2PC,分兩階段:
根 DTC 沿樹向下發送「準備」請求,參與者投票:
非根 DTC 收集下級投票,全為「就緒/唯讀」則投票「提交」,否則「中止」,回報上級。根 DTC 同理決定最終結果。若逾時未收到所有投票,根 DTC 判定回滾。
根 DTC 依最終結果廣播「提交」或「中止」請求。資源管理器執行持久化或回滾,結果逆向回報根 DTC。根 DTC 收到所有回報才確認事務完成。
參與者在第一階段投「就緒」後,若機器故障重啟,本地事務處於「未決」狀態。重啟後 DTC 向上級查詢最終結果,請求沿樹向上直到根 DTC(根節點永遠知曉結果)。管理者亦可強制提交/中止長期未決事務。
若根 DTC 僅有一個下級,無需投票機制,直接發送 SPC 請求。接收者若為資源管理器直接提交;若為 DTC,則依其下級數量遞迴決定採 SPC 或 2PC。圖 3 說明:左樹根與中間節點各有一下級,全採 SPC;右樹根有兩下級,全樹強制 2PC。
本系列下一篇將詳細介紹基於 System.Transactions 的事務程式設計。