什么是 Seata?
Seata是一个开源的分布式事务解决方案,致力于提供高性能、易用的分布式事务服务。Seata将为用户提供AT、TCC、SAGA、XA交易模型,为用户打造一站式分布式解决方案。
整体机制:
两个阶段提交协议的演变:
阶段1: 在同一个本地事务中提交业务数据(也就是真正的修改数据库)和回滚日志,然后释放本地锁和连接资源。
阶段2: 对于提交案例,异步快速地完成工作。 对于回滚情况,根据第一阶段创建的回滚日志进行补偿
概念认识:
- RM(ResourceManager) ,可以理解为一个一个的微服务,也叫事务参与者;
- TM(TranactionManager) 也是一个微服务,但是该微服务是事务的带头大哥,凡是标注
@GlobalTransactional
的就可以看作是个TM事务管理者,当然它同时也是个RM; 比如,订单服务下单成功后调用库存服务减库存,订单服务的方法上会标注@GlobalTransactional
,作为一个TM(库存服务这不需要标注),来管理订单和库存两个服务的整体事务; - TC(全局事务协调者) 也就是
seata-serve
r服务,用来保存全局的事务,分支事务,全局锁,然后通知各个RM进行事务提交或回滚;
SpringCloud + Seata(AT模式+文件模式) 的集成
准备:
- springcloud微服务:
- seata-order-6500-service订单服务;
- seata-stock-6502-service库存服务;
- TC:
- seata-server服务版本: seata-server-1.1.0.zip
第一步:下载1.1.0版本的TC服务,并解压,windows系统在解压后的文件找到.bat文件即可启动
紧接者会弹出dos窗口。输出stared就说明TC启动成功了;
第二步:创建订单库库存服务的数据库
注意
:每个业务库里面都需要有张undo_log
表
1.收到 TC 的回滚请求后,开始本地事务,执行如下操作。
2.通过 XID 和分支 ID 检索 UNDO LOG。
3.验证数据:将UNDO LOG中更新后的图像数据与当前数据进行比较,如果有差异,说明数据被当前事务外的操作改变了,应该在不同的策略中处理。
4.根据UNDO LOG中的before image和业务SQL的相关信息生成回滚SQL语句
#undo_log表结构,每个业务数据库下都需要有此表
CREATE TABLE `undo_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`branch_id` bigint NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int 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=9 DEFAULT CHARSET=utf8;
第三步:在6500订单服务上引入seata的依赖
<!--seata分布式事务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>