Seata是阿里開源的一個(gè)分布式事務(wù)框架透绩。
Seata主要有兩種分布式事務(wù)實(shí)現(xiàn)方案塞栅,AT及TCC
- AT模式主要關(guān)注多 DB 訪問的數(shù)據(jù)一致性荒勇,當(dāng)然也包括多服務(wù)下的多 DB 數(shù)據(jù)訪問一致性問題
- TCC 模式主要關(guān)注業(yè)務(wù)拆分沦零,在按照業(yè)務(wù)橫向擴(kuò)展資源時(shí)餐曼,解決微服務(wù)間調(diào)用的一致性問題
AT模式/MT模式
Seata AT模式是基于XA事務(wù)演進(jìn)而來的一個(gè)分布式事務(wù)中間件默辨,XA是一個(gè)基于數(shù)據(jù)庫實(shí)現(xiàn)的分布式事務(wù)協(xié)議德频,本質(zhì)上和兩階段提交一樣,需要數(shù)據(jù)庫支持缩幸,Mysql5.6以上版本支持XA協(xié)議壹置,其他數(shù)據(jù)庫如Oracle,DB2也實(shí)現(xiàn)了XA接口表谊。
AT不依賴與數(shù)據(jù)庫本身對(duì)協(xié)議的支持钞护,當(dāng)然也不需要數(shù)據(jù)庫支持 XA 協(xié)議。這點(diǎn)對(duì)于微服務(wù)化的架構(gòu)來說是非常重要的:應(yīng)用層不需要為本地事務(wù)和分布式事務(wù)兩類不同場(chǎng)景來適配兩套不同的數(shù)據(jù)庫驅(qū)動(dòng)爆办。
原理
- Transaction Coordinator (TC): 事務(wù)協(xié)調(diào)器难咕,維護(hù)全局事務(wù)的運(yùn)行狀態(tài),負(fù)責(zé)協(xié)調(diào)并驅(qū)動(dòng)全局事務(wù)的提交或回滾距辆。
- Transaction Manager (TM): 控制全局事務(wù)的邊界余佃,負(fù)責(zé)開啟一個(gè)全局事務(wù),并最終發(fā)起全局提交或全局回滾的決議跨算。
- Resource Manager (RM): 控制分支事務(wù)爆土,負(fù)責(zé)分支注冊(cè)、狀態(tài)匯報(bào)漂彤,并接收事務(wù)協(xié)調(diào)器的指令雾消,驅(qū)動(dòng)分支(本地)事務(wù)的提交和回滾。
使用
- 創(chuàng)建Seata TC Server服務(wù)
Seata TC Server的 db 數(shù)據(jù)庫為:
(1)global_table :the table to store GlobalSession data
(2)branch_table:the table to store BranchSession data
(3)lock_table:the table to store lock data - 使用方數(shù)據(jù)庫增加undo_log表:用于分支事務(wù)的回滾
- 方法上增加@GlobalTransactional注解
Dubbo 分布式事務(wù) Seata 入門 | 芋道源碼 —— 純?cè)创a解析博客
執(zhí)行過程圖
![特別注意的是:
- 回滾時(shí)通過 XID 和 Branch ID 查找到相應(yīng)的 UNDO LOG 記錄并校驗(yàn)挫望。
數(shù)據(jù)校驗(yàn):拿 UNDO LOG 中的后鏡與當(dāng)前數(shù)據(jù)進(jìn)行比較,如果有不同狂窑,說明數(shù)據(jù)被當(dāng)前全局事務(wù)之外的動(dòng)作做了修改媳板。這種情況,需要根據(jù)配置策略來做處理泉哈,詳細(xì)的說明在另外的文檔中介紹蛉幸。 - 業(yè)務(wù)更新 ssql與插入到UNDO_LOG 表鏡像數(shù)據(jù)是同一個(gè)數(shù)據(jù)。
- 整個(gè)過程 全局鎖 在 tx1 結(jié)束前一直是被 tx1 持有的丛晦,所以不會(huì)發(fā)生 臟寫 的問題奕纫。
http://seata.io/zh-cn/docs/overview/what-is-seata.html
問題:
最大的問題:事務(wù)隔離級(jí)別不能做到 讀已提交 的水平,SQL 的解析還不能涵蓋全部的語法等烫沙。
問題一:隔離性減弱:隔離級(jí)別變?yōu)樽x未提交
在數(shù)據(jù)庫本地隔離級(jí)別 讀已提交 或以上的前提下匹层,F(xiàn)escar 設(shè)計(jì)了由事務(wù)協(xié)調(diào)器維護(hù)的 全局寫排他鎖,來保證事務(wù)間的 寫隔離锌蓄,將全局事務(wù)默認(rèn)定義在 讀未提交 的隔離級(jí)別上升筏。
我們對(duì)隔離級(jí)別的共識(shí)是:微服務(wù)場(chǎng)景產(chǎn)生的分布式事務(wù)撑柔,絕大部分應(yīng)用在 讀已提交 的隔離級(jí)別下工作是沒有問題的。而實(shí)際上您访,這當(dāng)中又有絕大多數(shù)的應(yīng)用場(chǎng)景铅忿,實(shí)際上工作在 讀未提交 的隔離級(jí)別下同樣沒有問題,但仍建議事前做好隔離保證無臟數(shù)據(jù)(如加分布式鎖)
灵汪。
問題二:回滾時(shí)數(shù)據(jù)已被改變
回滾時(shí)通過 XID 和 Branch ID 查找到相應(yīng)的 UNDO LOG 記錄并校驗(yàn)檀训。
數(shù)據(jù)校驗(yàn):拿 UNDO LOG 中的后鏡與當(dāng)前數(shù)據(jù)進(jìn)行比較,如果有不同享言,說明數(shù)據(jù)被當(dāng)前全局事務(wù)之外的動(dòng)作做了修改峻凫。這種情況,需要根據(jù)配置策略來做處理担锤。
解決方式: 臟數(shù)據(jù)需手動(dòng)處理蔚晨,根據(jù)日志提示修正數(shù)據(jù)或者將對(duì)應(yīng)undo刪除(可自定義實(shí)現(xiàn)FailureHandler做郵件通知或其他)
概覽 · seata/seata Wiki · GitHub
官網(wǎng):
Seata 是什么
概覽 · seata/seata Wiki · GitHub
Seata 極簡(jiǎn)入門
引用
Seata簡(jiǎn)介(附帶與其他分布式事務(wù)解決方案對(duì)比)數(shù)據(jù)庫古柏樹下的博客-CSDN博客
seata分布式事務(wù)原理解釋,AT模式簡(jiǎn)介_tianyaleixiaowu的專欄-CSDN博客_seata分布式事務(wù)原理
阿里開源分布式事務(wù)組件 seata : AT 模式的分支事務(wù)處理 - beanlam - SegmentFault 思否