官網(wǎng)
Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù)啦逆。Seata 將為用戶提供了 AT、TCC锹漱、SAGA 和 XA 事務(wù)模式姐直,為用戶打造一站式的分布式解決方案岳锁。
總體結(jié)構(gòu)
- TC (Transaction Coordinator) - 事務(wù)協(xié)調(diào)者(對應(yīng)2pc中TM)
- RM: 資源管理器(同2pc中RM )
- TM: 事務(wù)管理器(發(fā)起事務(wù)的RM)
image.png
AT模式
無侵入自動補償?shù)氖聞?wù)模式
TCC模式
支持 TCC 模式并可與 AT 混用潘拨,靈活度更高
SAGA模式
為長事務(wù)提供有效的解決方案
Seate使用
搭建TC
- 下載 seata-server URL
- 修改配置
registry.conf
file.conf
- 配置數(shù)據(jù)庫
-- 分支事務(wù)表 CREATE TABLE `branch_table` ( `branch_id` bigint(20) NOT NULL, `xid` varchar(128) NOT NULL, `transaction_id` bigint(20) DEFAULT NULL, `resource_group_id` varchar(32) DEFAULT NULL, `resource_id` varchar(256) DEFAULT NULL, `branch_type` varchar(8) DEFAULT NULL, `status` tinyint(4) DEFAULT NULL, `client_id` varchar(64) DEFAULT NULL, `application_data` varchar(2000) DEFAULT NULL, `gmt_create` datetime(6) DEFAULT NULL, `gmt_modified` datetime(6) DEFAULT NULL, PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 全局事務(wù)表 CREATE TABLE `global_table` ( `xid` varchar(128) NOT NULL, `transaction_id` bigint(20) DEFAULT NULL, `status` tinyint(4) NOT NULL, `application_id` varchar(32) DEFAULT NULL, `transaction_service_group` varchar(32) DEFAULT NULL, `transaction_name` varchar(128) DEFAULT NULL, `timeout` int(11) DEFAULT NULL, `begin_time` bigint(20) DEFAULT NULL, `application_data` varchar(2000) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`xid`), KEY `idx_gmt_modified_status` (`gmt_modified`,`status`), KEY `idx_transaction_id` (`transaction_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 全局鎖 CREATE TABLE `lock_table` ( `row_key` varchar(128) NOT NULL, `xid` varchar(96) DEFAULT NULL, `transaction_id` bigint(20) DEFAULT NULL, `branch_id` bigint(20) NOT NULL, `resource_id` varchar(256) DEFAULT NULL, `table_name` varchar(32) DEFAULT NULL, `pk` varchar(36) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`row_key`), KEY `idx_branch_id` (`branch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
搭建TM
- 配置文件
registry.conf
file.conf
可修改端口 默認(rèn):8091- pom
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-seata</artifactId> <version>2.2.0.RELEASE</version> </dependency>
- 注解
@GlobalTransactional(rollbackFor = Exception.class)
- sql
CREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context` varchar(128) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime NOT NULL, `log_modified` datetime NOT NULL, `ext` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8;
TCC模式
@LocalTCC
public interface RmOneInterface {
// 制定 confirm 和 cancel
@TwoPhaseBusinessAction(name = "rm1TccAction" , commitMethod = "rm1Commit" ,rollbackMethod = "rm1Rollback")
public String rm1(BusinessActionContext businessActionContext);
public boolean rm1Commit(BusinessActionContext businessActionContext);
public boolean rm1Rollback(BusinessActionContext businessActionContext);
}
簡單對比
2pc | tcc | 消息隊列 | |
---|---|---|---|
一致性 | 強 | 最終 | 最終 |
吞吐量 | 低 | 中等 | 高 |
復(fù)雜度 | 簡單 | 復(fù)雜 | 中等 |
TCC異常
- 空回滾
try 未執(zhí)行, cancel執(zhí)行 解決:添加事務(wù)控制表(全局id /分支id/狀態(tài): 初始化/已提交/已回滾)
- 冪等
重試,多次執(zhí)行 cancel/confirm 解決::添加事務(wù)控制表(全局id /分支id/狀態(tài):初始化/已提交/已回滾)
- 懸掛
cancel 在try之前執(zhí)行 解決: (事務(wù)控制表)狀態(tài):初始化>已提交>已回滾 狀態(tài)不可逆