分佈式事務(一)開篇:XA事務

隨着近些年服務化的興起,數據庫也隨之進行獨立拆分;同時由於互聯網數據量較大,單個數據庫實例已經無法承載壓力需要進行水平拆分; 無論是業務數據庫獨立還是分片,在一個完整的業務流程中只要涉及到跨庫操作,確保事務一致性都是一個極其重要的考量。

基礎原理

在瞭解分佈式事務之前,我們需要了解CAP原理:

即在一個分佈式系統中,可用性和一致性無法得到同時保證;這裏的一致性說的是強一致性。

在分佈式系統中,如果我們保證強一致性,則可用性會受到限制;在此基礎上我們需要了解BASE思想:

即在保證基本可用的前提下,我們只要保證數據的最終一致性即可。
在達到最終一致性的過程中,數據可能存在軟狀態(中間狀態),這個是可以接受的。

關於CAP和BASE思想的具體詳細解讀大家可以參考:
CAP原理
BASE思想

常用的分佈式解決方案

名稱 特點
基於DTP模型的XA 事務 強一致性
基於TCC 模型 最終一致性
基於SAGA 模型 最終一致性
本地消息表 最終一致性
事務消息 最終一致性

接下來會逐篇進行說明,本篇主要講XA事務,下面開始進入正題。

XA起源以及簡介

最早的分佈式事務模型是由 X/Open公司提出,這個公司是由多個公司組成的一個用於定義和推進信息技術領域開放標準的公司。
它提出了DTP模型,即:Distributed Transaction Processing模型,也就是大家常說的 X/Open XA 協議,簡稱 XA 協議。 XA協議要求資源管理器(例如數據庫、redis、MQ等)本身提供對協議的支持。
XA通過2PC(Two-phase Commit)即二階段提交來實現分佈式事務的提交或者回滾。

DTP模型

DTP模型定義了以下幾個角色,這些角色通過不同的通信協議來完成XA事務。

  • AP(Application Program):即應用程序。
  • TM(Transaction Manager):事務管理器,負責協調和管理事務;TM需要根據各個資源管理器反饋狀態決定是否提交或者回滾。
  • RM(Resource Manager):資源管理器(例如:DB、Redis、Mq等),資源管理器必須實現 XA 定義的接口。
  • CRM(Communication Resource Manager)通信資源管理器:控制一個或多個 TM 之間分佈式應用的通信。
  • CP(Communication Protocol)通信協議:
    • XA 協議:應用服務器與事務管理之間通信的協議。
    • TX 協議:全局事務管理器與資源管理器之間通信的接口。

二階段提交過程

正如我們上面所述,XA協議是一個二階段提交的事務模型,它的具體執行如下:

  • 第一階段:準備階段,事務管理器詢問資源管理器分支事務是否正常執行完畢,資源管理返回是或者否。
  • 第二階段:提交階段,事務管理器根據上一階段所有資源管理器的反饋結果,要求統一commit或者rollback。

XA事務模型

一般情況下,我們通過一個應用來接入多個數據源,實現分佈式事務;其大致模型如下:

spring boot with XA

java中提供了JTA(Java Transaction API),允許應用程序執行分佈式事務處理;JTA只提供接口規範,而不提供具體實現。

市面上有atomikos、bitronix、narayana等框架實現了提供了分佈式事務的解決方案,這裏使用 springboot2.3.3 + atomikos + JPA + mysql8.X實現XA事務,有需要的可以參考。
gitee-spring boot with atomikos

XA優點

  • XA協議簡單,實現成本較低;且在各大主流數據庫都有實現。
  • 對業務代碼沒有入侵。

XA缺點

  • 部分資源管理器支持不夠,例如mysql只有InnoDB支持。
  • 單點問題:主要產生在事務管理器上:假設事務管理器宕機,則會導致資源管理器持續等待,阻塞數據庫。
  • 併發問題:主要是由於XA事務隔離級別使用的是序列化,此隔離級別下數據庫事務是順序執行,無法進行併發。
爲什麼使用序列化隔離級別?
由於事務的存在是實現提交和回滾機制,如果不進行高隔離級別,事務快照保存存在困難,且多個事務併發執行會導致回滾時無法回滾到準確的數據。
  • 無法完全保證數據一致:例如在第二階段提交事務的過程中,TM發出提交命令,一個資源管理器得到命令,而另一個資源管理器因爲網絡因素沒有接收到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章