Spring Cloud 系列:基於Seata 實現 XA模式

https://seata.io/zh-cn/docs/user/mode/xa

https://seata.io/zh-cn/docs/dev/mode/xa-mode

XA 規範 是 X/Open 組織定義的分佈式事務處理(DTP,Distributed Transaction Processing)標準,XA 規範 描述了全局的TM與局部的RM之間的接口,幾乎所有主流的數據庫都對 XA 規範 提供了支持。

XA 模式是從 1.2 版本支持的事務模式。XA 規範 是 X/Open 組織定義的分佈式事務處理(DTP,Distributed Transaction Processing)標準。Seata XA 模式是利用事務資源(數據庫、消息服務等)對 XA 協議的支持,以 XA 協議的機制來管理分支事務的一種事務模式。

前提

  • 基於支持本地 ACID 事務的關係型數據庫。
  • Java 應用,通過 JDBC 訪問數據庫。

兩階段提交

XA是規範,目前主流數據庫都實現了這種規範,實現的原理都是基於兩階段提交。

正常情況:

image

異常情況:

image

一階段:

  • 事務協調者通知每個事物參與者執行本地事務
  • 本地事務執行完成後報告事務執行狀態給事務協調者,此時事務不提交,繼續持有數據庫鎖

二階段:

  • 事務協調者基於一階段的報告來判斷下一步操作
    • 如果一階段都成功,則通知所有事務參與者,提交事務
    • 如果一階段任意一個參與者失敗,則通知所有事務參與者回滾事務

4.1.2.Seata的XA模型

Seata對原始的XA模式做了簡單的封裝和改造,以適應自己的事務模型,基本架構如圖:

image

RM一階段的工作:

​ ① 註冊分支事務到TC

​ ② 執行分支業務sql但不提交

​ ③ 報告執行狀態到TC

TC二階段的工作:

  • TC檢測各分支事務執行狀態

    a.如果都成功,通知所有RM提交事務

    b.如果有失敗,通知所有RM回滾事務

RM二階段的工作:

  • 接收TC指令,提交或回滾事務

優缺點

XA模式的優點是什麼?

  • 事務的強一致性,滿足ACID原則。
  • 常用數據庫都支持,實現簡單,並且沒有代碼侵入

XA模式的缺點是什麼?

  • 因爲一階段需要鎖定數據庫資源,等待二階段結束才釋放,性能較差
  • 依賴關係型數據庫實現事務

實現XA模式

Seata的starter已經完成了XA模式的自動裝配,實現非常簡單,步驟如下:

1)修改application.yml文件(每個參與事務的微服務),開啓XA模式:

seata:
  enabled: true
  tx-service-group: default_tx_group # 事務組名稱
  service:
    vgroup-mapping:
      default_tx_group: default
    grouplist:
      default: 127.0.0.1:8091
  data-source-proxy-mode: XA

2)給發起全局事務的入口方法添加@GlobalTransactional註解:

本例中是OrderServiceImpl中的create方法.

image

四種模式對比

我們從以下幾個方面來對比四種實現:

  • 一致性:能否保證事務的一致性?強一致還是最終一致?
  • 隔離性:事務之間的隔離性如何?
  • 代碼侵入:是否需要對業務代碼改造?
  • 性能:有無性能損耗?
  • 場景:常見的業務場景

如圖:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章