知识卡片
阿里AT事务用逆向SQL和全局锁换取吞吐量代价是隔离性
内容
阿里GTS提出的AT事务模式,是把[[TCC的Try-Confirm-Cancel如何在分布式事务 中保留隔离性]]式的”人工设计补偿”自动化的尝试,参照XA两段提交但专门解决 了2PC的木桶效应——2PC准备阶段必须等所有数据源都返回成功才能统一提交, 所有锁资源都要等到最慢的事务完成才能释放。AT事务的做法是自动拦截业务 SQL,在提交前保存修改前后的数据快照并生成行锁,随本地事务一起提交, 相当于自动记录了重做和回滚日志;如果分布式事务成功,只需清理各数据源的 日志;如果需要回滚,则根据快照自动生成”逆向SQL”来补偿。这样每个数据源 可以各自单独提交并立刻释放锁,不再受制于最慢的参与者,吞吐量比2PC大幅 提升,但代价是牺牲了隔离性甚至波及原子性——如果本地事务提交后、分布式 事务完成补偿前,该数据又被别的操作修改过(脏写),自动生成的逆向SQL就 无法正确补偿,只能人工介入。为此GTS增加了”全局锁”机制:本地事务提交前 必须先拿到针对该记录的全局锁才允许提交,以牺牲部分性能为代价避免脏写; 读隔离方面AT默认是读未提交,可能脏读,因为直接阻塞读的代价太大而不这么 做。这印证了本章反复出现的主题:分布式事务没有一揽子解法,只能因地制宜。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.4.4节
"SAGA事务"末尾对AT事务模式的介绍(源文件:_epub-src对应
OEBPS/Text/chapter34.xhtml)
- 结论依据:原文说明AT事务通过自动拦截SQL生成快照和逆向SQL来实现异步
提交,解决2PC木桶效应但牺牲隔离性,并说明全局锁如何以性能为代价避免
脏写,直接支撑本卡片结论。
- 原始内容:这种异步提交的模式,相比2PC极大地提升了系统的吞吐量水平,
而代价就是大幅度牺牲了隔离性,甚至直接影响到了原子性……GTS增加了一个
"全局锁"(Global Lock)的机制来实现写隔离……分布式事务中没有一揽子
包治百病的解决办法,因地制宜地选用合适的事务处理方案才是唯一有效的
做法。