Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
一:AT
AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
1)一阶段,各个分支向TC汇报执行情况
2)二阶段,TC根据汇报情况,决定执行成功还是回滚,然后通知各个RM执行相应的操作
大概过了下源码,总结下AT的流程
- springboot启动时,初始化TMClient(负责一阶段)和RMClient(负载二阶段)和服务器通信
- 在拦截器中看调用的controller方法是否有GlobalTransactional注解,如果有就请求TM生成一个xid,然后放到一个threadlocal的对象中
- 在本地每次执行sql的过程中,如果发现有xid,则向TM报告分支信息,并把sql的前镜像和后镜像插入本地undo表中,提交本地数据
- 调用其他的服务时,如果是http调用,则会吧xid放到http的header中发送过去,其他服务在拦截器中获取并设置到threadlocal对象中,下面操作数据的流程,和3一样了
- 如果其中有某个分支执行失败,则TM通知各个RM执行回滚操作,RM通过undo来对比数据是否有脏数据,如果没有就执行rollback,如果有则会执行失败,需要人工干预
- 如果所有分支成功,则TM通知各个RM执行commit操作,由于sql已经提交到库,所以基本就是删除本地的undo
- 如果controller方法抛出异常,也会执行rollback
二:TCC
AT 模式基于 支持本地 ACID 事务 的 关系型数据库:
一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
二阶段 commit 行为:马上成功结束,自动 异步批量清理回滚日志。
二阶段 rollback 行为:通过回滚日志,自动 生成补偿操作,完成数据回滚。
相应的,TCC 模式,不依赖于底层数据资源的事务支持:
一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
二阶段 commit 行为:调用 自定义 的 commit 逻辑。
二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
三:SAGA
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
适用场景:
- 业务流程长、业务流程多
- 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口
优势:
- 一阶段提交本地事务,无锁,高性能
- 事件驱动架构,参与者可异步执行,高吞吐
- 补偿服务易于实现
缺点:
- 不保证隔离性(应对方案见后面文档)
四:和springcloud 集成配置文件说明及注意点
- 每个微服务库中需要有undo表
- 每个微服务需要有自己的seata配置文件registry.conf,file.conf
- spring.cloud.alibaba.seata.tx-service-group=AAA(application.yml)和service.vgroupMapping.AAA(file.conf)要配置一直(AAA内容要配置一直),要不找不到TC,具体原因可以参考http://seata.io/zh-cn/docs/user/transaction-group.html
- registry.type=nacos说明client需要到nacos中找TC
- registry.type=file说明client需要通过file.conf中的default.grouplist = "192.168.100.18:8091"找TC
详细的配置项说明可以参考http://seata.io/zh-cn/docs/user/configurations.html
五:实战
可以参考官网http://seata.io/zh-cn/docs/overview/what-is-seata.html和demo:https://github.com/seata/seata,里面有seata和各个框架的集成的dmeo
参考网站:
https://github.com/seata/seata
http://seata.io/zh-cn/docs/overview/what-is-seata.html
https://www.jianshu.com/p/ea454a710908