1.Seata 介绍
官⽹地址:http://seata.io/,其中的⽂档、播客中提供了⼤量的使⽤说明、源码分析。
2.Seata架构
2.1.Seata中有三个重要组成部分
- TC(Transcation Coordinator)事务协调者
维护全局事务和分支事务,管理分支事务的提交或回滚; - TM(Transcation Manager)事务管理者
定义全局事务的范围,管理全局事务的开启、提交、回滚; - RM(Resource Manager)资源管理者
管理分支事务处理的资源,通过协调者注册分支事务,并报告事务状态,管理分支事务的提交、回滚;
2.2.Seata中不同的模式
- XA模式
强一致性的分段事务,牺牲一定的可用性,无业务入侵 - AT模式
最终一致的分段式事务,无业务入侵,Seata默认的模式 - TCC模式
最终一直的分段式事务,会有业务入侵 - SAGA模式
长事务模式,有业务入侵
3.模式介绍
3.1 XA模式
XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接⼝,⼏乎所有主流的数据库都对 XA 规范提供了⽀持。XA 模式通过两阶段的提交实现。
一阶段:
- 事务协调器通知各个分支事务执行本地事务;
- 分支事务执行完后,不进行事务提交,继续持有数据库锁;
二阶段:
- 由事务协调器判断最终事务是否要提交;
- 所有的分支事务都执行成功,通知所有分支事务,提交事务;
- 如果有一个分支事务执行失败,通知所有的事务回滚事务;
3.1.1.Seata的XA模式
Seata 的 XA 模式对标准的 XA 模式做了一定的封装和改造。
RM一阶段:
- 注册分支事务到 TC
- 执行分支事务 sql,不提交事务
- 提交事务执行状态到 TC
TC二阶段:
- TC检测各分支事务状态
- 如果全部成功,通知所有的 RM 提交事务
- 如果有失败的事务,通知多有的 RM 回滚事务
RM二阶段:
- 接收 TC 指令,提交事务或者回滚
3.1.2优缺点
优点:
- 事务强一致性,满足ACID原则
- 常用的数据库都支持,实现简单,没有代码入侵
缺点:
- 一阶段需要锁定数据库资源,二阶段结束后才会释放,性能较差
- 依赖与关系型数据库
3.2.AT模式
AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过⻓的缺陷。
RM一阶段:
- 注册分支事务
- 记录 undo-log(数据快照)
- 执行sql并提交
- 报告事务状态
RM二阶段:
- TC判断所有分支事务执行成功,删除 undo-log
- TC判断有分支事务直观性失败,通过 undo-log 将数据恢复
3.2.1.优缺点
优点:
- 一阶段完直接提交事务,释放数据库锁,性能好;
- 利用全局锁实现读写隔离;
- 没有代码入侵,框架自动完成回滚和提交
缺点:
- 两个阶段之间属于软状态,最终一致
- 框架的快照功能会影响性能,但是比 XA 模式要好
4. AT 与 XA 的区别
- XA 模式一阶段不提交事务,锁定资源,AT 模式提交事务,不锁定资源;
- XA 模式依赖数据库做回滚,AT 依赖数据快照做回滚;
- XA模式为强一致,AT模式为最终一致;
5.AT模式脏写问题
可以在提交事务前,获取一个全局锁,提交事务后释放。