分佈式事務框架 seata

1. 什麼是 seata

Seata 是一款開源的分佈式事務解決方案,致力於提供高性能和簡單易用的分佈式事務服務。Seata 將爲用戶提供了 AT、TCC、SAGA 和 XA 事務模式,爲用戶打造一站式的分佈式解決方案。

2. seata 發展歷程

阿里巴巴作爲國內最早一批進行應用分佈式(微服務化)改造的企業,很早就遇到微服務架構下的分佈式事務問題。阿里巴巴對於分佈式事務問題先後發佈了以下解決方案:

3. seata 中相關事務概念

4. seata 的工作流程相關概念

Seata 對分佈式事務的協調和控制,主要是通過 XID 和 3 個核心組件實現的。

XID

XID 是全局事務的唯一標識,它可以在服務的調用鏈路中傳遞,綁定到服務的事務上下文中。

核心組件

Seata 的核心組件可分爲 Seata 服務端和 Seata 客戶端兩類

Seata 定義了 3 個核心組件:

以上三個組件相互協作,TC 以 Seata 服務器(Server)形式獨立部署,TM 和 RM 則是以 Seata Client 的形式集成在微服務中運行。

5. seata 的工作流程

TC 以 Seata 服務器(Server)形式獨立部署,TM 和 RM 則是以 Seata Client 的形式集成在微服務中運行,

整體工作流程如圖:

Seata 的整體工作流程如下:

  1. TM 向 TC 申請開啓一個全局事務,全局事務創建成功後,TC 會針對這個全局事務生成一個全局唯一的 XID(此時,由 TM 發起的全局事務已經開啓)

  2. XID 通過服務的調用鏈傳遞到其他服務

  3. RM 向 TC 註冊一個分支事務,並將其納入 XID 對應全局事務的管轄(事務參與者執行本地事務,此時分支事務已經執行完成,並反饋給 TC 執行結果。可以理解爲 AT 模式下的第一個階段)

  4. TM 根據 TC 收集的各個分支事務的執行結果,向 TC 發起全局事務提交或回滾決議(事務協調者根據事務管理者的決議,發送提交或回滾的調度命令,可以理解爲 AT 模式下的第二階段)

  5. TC 調度 XID 下管轄的所有分支事務完成提交或回滾操作

6. seata 的 AT 模式

seata 中提供了了 XA、TCC、SAGA、TC 四種模式。其中 TC 模式應用最爲廣泛,可應對大多數業務場景。也是 seata 的主要模式

前提

整體機制

官網描述:

兩階段提交協議的演變:

     提交異步化,非常快速地完成。

     回滾通過一階段的回滾日誌進行反向補償。

其實 AT 模式可以理解爲 XA 二階段提交的一個變種,將二階段提交的部分在一定階段就已完成,而二階段的回滾操作是通過回滾日誌完成,並是不依賴於數據庫的事務機制。也就是說一階段數據實際上已經提交了,與此同時原子性提交的還有對應的回滾日誌

寫隔離

讀隔離

在數據庫本地事務隔離級別 讀已提交(Read Committed) 或以上的基礎上,Seata(AT 模式)的默認全局隔離級別是 讀未提交(Read Uncommitted) 。

如果應用在特定場景下,必需要求全局的 讀已提交 ,目前 Seata 的方式是通過 SELECT FOR UPDATE 語句的代理。

7. seata 的 AT 模式具體執行流程

假設前置條件

假設當前存在一個業務表:product

n11bwx

分支事務的業務邏輯:

update product set name = 'GTS' where name = 'TXC';

一階段

select id, name, since from product where name = 'TXC';
select id, name, since from product where id = 1;
{
     "branchId": 641789253,
      "undoItems": [{
           "afterImage": {
                "rows": [{
                     "fields": [{
                          "name": "id",
                           "type": 4,
                           "value": 1
                      }, {
                           "name": "name",
                           "type": 12,
                           "value": "GTS"
                     }, {
                           "name": "since",
                           "type": 12,
                          "value": "2014"
                    }]
               }],
              "tableName": "product"
         },
        "beforeImage": {
                  "rows": [{
                           "fields": [{
                           "name": "id",
                           "type": 4,
                           "value": 1
                    }, {
                           "name": "name",
                           "type": 12,
                           "value": "TXC"
                    }, {
                            "name": "since",
                            "type": 12,
                             "value": "2014"
                    }]
              }],
             "tableName": "product"
         },
          "sqlType": "UPDATE"
     }],
     "xid": "xid:xxx"
}

二階段 - 提交

相關業務在一階段已經提交了,二階段只需要刪除已經沒有用處的回滾日誌即可。同時還是異步刪除,效率更高

二階段 - 回滾

相關業務在一階段已經提交了,所以二階段的回滾相當於又開啓了一個事務。一階段保存的後鏡像來用於對比是否有其他動作修改了這條數據,一階段保存的前鏡像用於回滾語句的生成

update product set name = 'TXC' where id = 1;
souce://www.yuque.com/u27809381/ca4o9w/avy27g
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bUQhtSAS7HeY7RNI1zBY4w