六合哪家做網(wǎng)站建設(shè)網(wǎng)站 軟件
0.Seata官方文檔
1.Seata概念及原理
-
Seata是什么
- Seata 是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分布式解決方案。
-
Seata主要由三個重要組件組成
- TC(Transaction Coordinator):事務協(xié)調(diào)器,管理全局的分支事務的狀態(tài),用于全局性事務的提交和回滾
- TM(Transaction Manager):事務管理器,用于開啟、提交或者回滾全局事務
- RM(Resource Manager):資源管理器,用于分支事務上的資源管理,向TC注冊分支事務、上報分支事務的狀態(tài)、接受TC的命令來提交或者回滾分支事務
- 傳統(tǒng)XA協(xié)議實現(xiàn)2PC方案的RM是在數(shù)據(jù)庫層,RM本質(zhì)上就是數(shù)據(jù)庫自身
- Seata的RM是以jar包的形式嵌入在應用程序里面
-
架構(gòu)理解:TC為單獨部署的Server服務端,TM和RM為嵌入到應用中的Client客戶端
?
-
其它術(shù)語
- XID:TM請求TC開啟一個全局事務,TC會生成一個XID作為該全局事務的編號,XID會在微服務的調(diào)用鏈路中傳播,保證將多個微服務的子事務關(guān)聯(lián)在一起
-
Seata事務處理過程描述
- A服務的TM向TC申請開啟(begin)一個全局事務,全局事務創(chuàng)建成功并生成一個全局唯一的XID
- A服務的RM向TC注冊分支事務
- A服務執(zhí)行分支事務,對數(shù)據(jù)庫進行操作
- A服務遠程調(diào)用B服務,并把XID在微服務調(diào)用鏈路的上下文中傳播
- B服務的RM向TC注冊分支事務,并將其納入XID對應的全局事務的管轄
- B服務執(zhí)行分支事務,對數(shù)據(jù)庫進行操作
- 全局事務調(diào)用鏈處理完畢,TM根據(jù)有無異常向TC發(fā)起針對XID的全局提交(commit)或回滾(rollback)決議
- TC調(diào)度XID下管轄的全部分支事務完成提交(commit)或回滾(rollback)請求
-
Seata實現(xiàn)分布式事務,關(guān)鍵是UNDO_LOG(回滾日志記錄表)
- 在每個應用需要分布式事務的業(yè)務庫中創(chuàng)建這張表,這個表的核心作用是將業(yè)務數(shù)據(jù)在更新前后的數(shù)據(jù)鏡像組織成回滾日志,保存在UNDO_LOG表中,以便業(yè)務異常能隨時回滾
-
Seata有四種模式
-
AT
-
AT模式可以應對大多數(shù)的業(yè)務場景,并且基本可以做到無業(yè)務入侵,開發(fā)者無感知
-
用戶只需關(guān)心自己的業(yè)務SQL,AT模式分為兩個階段,可以認為是2PC
-
一階段:執(zhí)行用戶SQL
- Seata會攔截業(yè)務SQL,找到業(yè)務SQL要更新的業(yè)務數(shù)據(jù),在業(yè)務數(shù)據(jù)被更新前,將其保存為before image,然后執(zhí)行業(yè)務SQL更新業(yè)務數(shù)據(jù)
- 在業(yè)務數(shù)據(jù)更新之后,再將其保存成after image,最后生成行鎖
- 以上操作全部在一個數(shù)據(jù)庫事務內(nèi)完成,這樣保證了一階段操作的原子性
-
二階段:Seata框架自動生成提交或者回滾
- 二階段提交:因為業(yè)務SQL在一階段已經(jīng)提交至數(shù)據(jù)庫,所以Seata框架只需將一階段保存的快照數(shù)據(jù)和行鎖刪掉,完成數(shù)據(jù)清理即可
- 二階段回滾:還原業(yè)務數(shù)據(jù),回滾方式便是用before image 還原業(yè)務數(shù)據(jù);但在還原前要校驗臟寫,對比數(shù)據(jù)庫當前業(yè)務數(shù)據(jù)和after image,如果兩份數(shù)據(jù)完全一致就說明沒有臟寫,出現(xiàn)臟寫就需要轉(zhuǎn)人工處理
-
-
-
TCC
-
Sage
-
XA
-
2.Seata使用基于AT模式
-
創(chuàng)建undo_log表,每個庫都需要
CREATE TABLE IF NOT EXISTS `undo_log` (`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table'; ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
-
安裝Seata服務器,本人使用docker安裝
docker run -d --name gen-seata \-p 18091:8091 \seataio/seata-server:1.3.0
-
TC(事務協(xié)調(diào)器)需要存儲全局事務和分支事務的記錄,支持三種存儲模式
- file模式(默認):性能高,適合單機模式,在內(nèi)存中讀寫,并持久化到本地文件中
- 在bin/sessionStore/root.data文件
- db模式:性能較差,適合TC集群模式
- redis模式:性能較高,適合TC集群模式
- file模式(默認):性能高,適合單機模式,在內(nèi)存中讀寫,并持久化到本地文件中
-
項目添加依賴
<!--Seata分布式事務:安裝服務端版本需與客戶端版本保持一致--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions> </dependency> <dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version> </dependency>
-
application.yml文件
# seata配置 seata:tx-service-group: gen-user-service-groupservice:grouplist:default: 114.132.67.61:18091vgroup-mapping:gen-user-service-group: default
-
在Service方法上增加注解@GlobalTransactional