首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

基於 DTC 的分散式事務管理模型(下):事務登記、兩階段提交與單階段優化

     編輯:關於.NET

承上篇,當本地事務(LTM/KTM)提升為 DTC 管理的分散式事務後,DTC 成為本機所有資源管理器的管理者;跨機器呼叫時,雙方 DTC 透過協議協作。所有參與者(資源管理器、DTC)經由事務登記形成樹狀的事務提交樹,這是後續提交協定運作的基礎。

一、 事務登記與事務提交樹

登記流程如圖 1 所示:服務 A 起始事務,本機資源管理器向本機 DTC 登記;呼叫服務 B 時,事務資訊(分散式事務 ID、DTC 端點)隨訊息傳播,服務 B 重建事務並讓其本機 DTC 向服務 A 的 DTC 登記,形成上下級關係;服務 B 的資源管理器同樣向本機 DTC 登記。最終形成圖 2 的樹狀結構:根節點為起始端 DTC(全域提交協調器 GCC),葉節點為資源管理器,中間節點為各機器 DTC。

二、 兩階段提交協定

分散式事務提交採 2PC,分兩階段:

1. 第一階段:準備

根 DTC 沿樹向下發送「準備」請求,參與者投票:

  • 就緒:同意提交,承諾收到提交通知後完成本地提交。
  • 唯讀:同意提交,但不需接收後續提交通知。
  • 中止:否決提交,擁有一票否決權。

非根 DTC 收集下級投票,全為「就緒/唯讀」則投票「提交」,否則「中止」,回報上級。根 DTC 同理決定最終結果。若逾時未收到所有投票,根 DTC 判定回滾。

2. 第二階段:提交或中止

根 DTC 依最終結果廣播「提交」或「中止」請求。資源管理器執行持久化或回滾,結果逆向回報根 DTC。根 DTC 收到所有回報才確認事務完成。

3. 未決事務處理

參與者在第一階段投「就緒」後,若機器故障重啟,本地事務處於「未決」狀態。重啟後 DTC 向上級查詢最終結果,請求沿樹向上直到根 DTC(根節點永遠知曉結果)。管理者亦可強制提交/中止長期未決事務。

4. 單階段提交優化

若根 DTC 僅有一個下級,無需投票機制,直接發送 SPC 請求。接收者若為資源管理器直接提交;若為 DTC,則依其下級數量遞迴決定採 SPC 或 2PC。圖 3 說明:左樹根與中間節點各有一下級,全採 SPC;右樹根有兩下級,全樹強制 2PC。

本系列下一篇將詳細介紹基於 System.Transactions 的事務程式設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved