1.Seata介绍
Seata 是阿里巴巴和蚂蚁金服共同开发的开源项目,用于解决分布式事务问题。有两个设计初衷:
- 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
- 高性能:减少分布式事务解决方案所带来的性能消耗
这里采用seata中的AT分布式事务解决方案。
- AT模式主要关注多 DB 访问的数据一致性,当然也包括多服务下的多 DB 数据访问一致性问题
2.AT
2.1.AT模式的三个组件:
- Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
- Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚
2.2.执行流程
- 首先在每个数据库中新建undolog表,如下图所示:
- 在执行sql语句之前,保存数据快照至undolog,然后执行sql,保存新数据的快照,生成行锁,提交事务。这个过程不用等待,可直接完成本地事务的提交。生成行锁是为了防止其他事务修改。
- 所有的RM提交至TC(事务协调器),如果决议是全局提交,即没有错误不用回滚,那么TC会通知RM删除undolog信息,释放行锁,事务结束
- 如果决议是全局回滚,RM 收到协调器发来的回滚请求,然后会读取undolog表中执行sql语句前的信息,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。如果有多线程操作同一个数据库,在每个RM的undolog表中都有一个xid,用于区分身份,保证回滚不会出错。
3.Seata实战配置
具体配置过程参考github,大致如下
- 添加相关依赖
- 在每个需要分布式事务管理的微服务的application.yml文件中配置seata
- 本地启动Seata的事务协调器(TC),bin\fescar-server.bat
- 在业务微服务上添加@GlobalTransactional,配置完成
@GlobalTransactional–>分布式事务管理
@Transactional–>本地事务管理