官网
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
总体结构
- TC (Transaction Coordinator) - 事务协调者(对应2pc中TM)
- RM: 资源管理器(同2pc中RM )
- TM: 事务管理器(发起事务的RM)
image.png
AT模式
无侵入自动补偿的事务模式
TCC模式
支持 TCC 模式并可与 AT 混用,灵活度更高
SAGA模式
为长事务提供有效的解决方案
Seate使用
搭建TC
- 下载 seata-server URL
- 修改配置
registry.conf
file.conf
- 配置数据库
-- 分支事务表 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; -- 全局事务表 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
可修改端口 默认: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 | 消息队列 | |
---|---|---|---|
一致性 | 强 | 最终 | 最终 |
吞吐量 | 低 | 中等 | 高 |
复杂度 | 简单 | 复杂 | 中等 |
TCC异常
- 空回滚
try 未执行, cancel执行 解决:添加事务控制表(全局id /分支id/状态: 初始化/已提交/已回滚)
- 幂等
重试,多次执行 cancel/confirm 解决::添加事务控制表(全局id /分支id/状态:初始化/已提交/已回滚)
- 悬挂
cancel 在try之前执行 解决: (事务控制表)状态:初始化>已提交>已回滚 状态不可逆
网友评论