AT模式
前提
- 基于支持本地ACID事务的关系型数据库。
- 保证最终一致性
前辈XA模式
不要求高并发的分布式事务解决方案,保证强一致性。
准备阶段:各个事务分别将SQL语句在数据库执行但不提交,将就绪状态上报给协调者。
提交阶段:所有节点都就绪,协调者下达commit,每个参与者提交本地事务;如果有一个节点不就绪,协调者下达回滚。
缺点:在两个阶段本地事务都占用资源不提交,事务时间过长。
优化方案
是否可以缩短事务时间,把全局事务拆成分支事务,将执行SQL和提交或者回滚通过多个本地事务控制。
原理
- 一阶段各个事务分别将SQL语句在数据库执行,并根据SQL语句生成回滚日志,并将回滚日志添加到对应的undo_log表中,这个表属于seata分布式系统。并将本地事务提交。为了保证隔离性,防止多个事务对同一行数据修改,使用全局锁和本地锁保证。执行SQL前要先到本地锁,本地事务提交前,拿到该记录的全局锁,本地事务提交后释放本地锁。其他事务提价时,因为获取不到全局锁,只能重试。
- 二阶段协调者如果是commit,更新分支事务状态并清空回滚日志。如果是rollback,则根据undo_log回滚日志进行回滚。事务A执行回滚时获取不到本地锁会循环等待,知道事务b获取全局锁超时放弃本地锁并回滚本地事务,事务A此时获取到本地锁,进行回滚。这样不会发生脏写问题。