在計算的早期,不需要分佈式事務。 隨著應用程序數量的增加,數據同步成為一個重要問題。 公司為維護數據流方面的同步系統付出了很多。 因此,出現了稱為 XA(擴展架構)的兩階段提交協議。 該協議為全局事務處理提供了類似 ACID 的屬性。 在整篇文章中,我將嘗試解釋 XA 事務的細節以及 Spring 框架中 XA 事務的使用。

2階段提交協議是分佈式系統的原子提交協議。 顧名思義,該協議由兩個階段組成。 第一個是提交請求階段,其中事務管理器協調所有事務資源以提交或中止。 在提交階段,事務管理器根據每個事務資源的投票決定通過提交或中止來完成操作。 接下來我們將繼續討論 2PC 協議的實現細節。

有關通過 2PC 實現 Java + .NET 互操作性的資源,請參見此處。

XA 事務需要每個 XA 資源的全局事務 id 和本地事務 id(xid)。 每個 XA 資源都通過 start(xid) 方法登記到 XA 管理器。 該方法告訴 XA 資源正在參與事務(準備好操作)。 之後通過調用prepare(xid)方法實現2PC協議的第一階段。 此方法請求 XA 資源的 OK 或 ABORT 投票。 在收到每個 XA 資源的投票後,如果所有 XA 資源都發送 OK,則 XA 管理器決定執行 commit(xid) 操作,如果 XA 資源發送 ABORT,則決定執行回滾(xid)。 最後,為每個 XA 資源調用 end(xid) 方法,告知事務已完成。 看圖更好理解。 隨著我們構建 XA 事務實現的背景,接下來我們將更深入地了解輸入這個命令這個命令這個命令失敗和可能的解決方案。


由於網絡丟失,機器停機和一些管理員錯誤,故障隨時可能發生。 在 XA 事務中,我們將根據它們發生的階段對這些故障進行分類。 第一個失敗階段是在協議啟動之前。 這是一個簡單的故障,系統不需要回滾或任何類型的操作。 我們只是不為那個特定的時刻做手術。 第二種類型此命令此命令此命令失敗可能發生在準備(提交請求)階段,可以通過使用超時策略的回滾輕鬆處理。 最後但並非最不重要的是提交階段失敗,這可能由於不完整的回滾和鏈中的任何問題而發生。 在上述所有這些情況下,事務管理器都會嘗試恢復問題。 接下來我們將看到事務管理器如何嘗試克服故障。

在恢復時,事務管理器調用每個 XA 資源的恢復方法。 XA 資源跟踪日誌並嘗試重建其最新狀態。 事務管理器調用必要的回滾操作並完成任務。 這個過程似乎是一條幸福的道路,但有很多例外情況,日誌會出現問題,比如損壞。 在這些情況下,事務管理器遵循一些啟發式方法來解決問題。 此外,恢復過程取決於您在應用之前寫入操作日誌的預寫日誌。 在性能問題上,這些日誌以自己的格式編寫(不使用任何序列化),如果可能,系統應該更好地對它們進行批處理。 我們接下來進入有趣的部分,即 Spring 框架對 XA 事務的支持。

Spring 框架為開發 Web 和獨立應用程序提供了廣泛的環境。 與它提供的其他實用程序一樣,Spring 也支持 XA 事務。 但是,這種支持不是本機實現,需要休眠、Web 容器或提供 XA 事務管理的框架。 Spring 有 JtaTransactionManager,它提供事務管理實用程序並隱藏細節。 通過這種方式,我們可以對同時更新的多個 DataSource 進行事務管理。 當談到使用 XA 事務管理時,hibernate 和 web 容器對 XA 事務的支持是有據可查的,不需要提及。 但是,使用提供 XA 事務的框架可能會令人困惑。 因此,我將通過介紹 Bitronix 事務管理器來繼續這篇文章。

Bitronix 易於配置,同時為事務管理提供良好的支持。 它在獨立應用程序中不常用,但我將嘗試為獨立應用程序提供配置,如下所示。

我們現在可以有多個數據源,可以配置如下。 每個數據源都應該有一個唯一的 uniqueName 屬性。 下面的配置是針對Oracle的,其他數據庫可以有不同的配置。 關於任何其他細節,您可以查看 Bitronix 網站。

總而言之,我們試圖在一個獨立的應用程序中解釋什麼是 XA 事務、底層協議和 Bitronix 事務管理與 Spring 的集成。 為了擴展,XA Transactions 提供了同時修改不同的數據源。 此外,Web 容器或類似休眠的框架支持 XA 事務。 儘管如此,我們可能需要將事務管理集成到必須配置事務管理器的獨立應用程序中。 因此,XA 事務提供了對多個數據源的一致操作,並且公司可以使用它們。
我們希望本文對如何執行 XA 事務(2 階段提交):簡單指南有所幫助。 如果您有任何其他問題,我們很樂意為您解答; 請在以下部分與我們聯繫。 不要忘記分享 signalfix.net 與您的家人和朋友!