介绍
:::tips AT模式同样是分阶段提交的事务模型,但是弥补了XA模型中资源锁定周期过长的缺陷
Seata的AT模型流程图
阶段一RM的工作:
- 注册分支事务
- 记录undo-log(数据快照)
- 执行业务sql并提交
- 报告事务状态
阶段二提交时RM的工作:
- 删除undo-log
阶段二回滚时RM的工作:
- 根据undo-log恢复数据到更新前
AT模式与XA模式最大的区别:
- XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源
- XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚
- XA模式是强一致;AT模式是最终一致
:::
脏写问题
:::tips 在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题
解决思路就是引入了全局锁的概念,在释放DB锁之前,先拿到全局锁,避免同一时刻有另外一个事务来操作当前数据
:::
优缺点
:::tips AT模式的优点
- 一阶段完成直接提交事务,释放数据库资源,性能比较好
- 利用全局锁实现读写隔离
- 没有代码侵入,框架自动完成回滚和提交
AT模式的缺点
- 两阶段之间属于软状态,属于最终一致
- 框架的快照功能会影响性能,但比XA模式要好很多 :::