简介
Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。官网地址:Apache Seata
分布式事务解决思路
解决分布式事务,各个子事务之间必须能感知到彼此的事务状态,才能保证状态一致。
Seata事务管理中有三个重要的角色:
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态
- AT 模式:参见《Seata AT 模式》文档
- TCC 模式:参见《Seata TCC 模式》文档
- Saga 模式:参见《SEATA Saga 模式》文档
安装
微服务集成Seata
项目中引入Seata依赖
<!-- seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
将Seata配置共享到nacos中
XA模式
实现XA模式
Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:
- 修改application.yml文件(每个参与事务的微服务),开启XA模式:
seata:
data-source-proxy-mode: XA # 开启数据源代理的XA模式
- 给发起全局事务的入口方法添加@GlobalTransactional注解,本例中是OrderServiceImpl中的create方法:
@Override
@GlobalTransactional
public Long createOrder(OrderFormDTO order) {
// 服务1 ... 略
// 服务2 ...略
// 服务3 ...略
return order.getId();
}
- 重启服务并测试
AT模式
实现AT模式
首先,添加资料中的seata-at.sql到微服务对应的数据库中:
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT '分支事务id',
`xid` VARCHAR(128) NOT NULL COMMENT '全局事务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';
然后,修改application.yml文件,将事务模式修改为AT模式:
seata:
data-source-proxy-mode: AT # 开启数据源代理的AT模式
简述AT模式与XA模式最大的区别是什么?
- XA模式一阶段不提交事务,锁定资源;
- AT模式一阶段直接提交,不锁定资源。XA模式依赖数据库机制实现回滚;
- AT模式利用数据快照实现数据回滚。
- XA模式强一致;AT模式最终一致