✅Seata的AT模式和XA有什么区别?

典型回答

XA是一个典型的分布式事务解决方案,是一个强一致性模型,基于XA的2PC和3PC一直都是业内比较成熟的分布式方案,但是,他们都存在着各种各样的问题。

Seata中的AT模式其实和2PC很像,都是把一个分布式事务分成了2个阶段,那他们之间有什么区别呢?

主要区别就是在一阶段和二阶段做的事情上。

AT XA
1阶段 各个分支事务正常执行并提交,并记录日志,这些日志可以用来在二阶段进行回滚 各个分支事务执行预提交操作,数据库锁定资源但不实际提交。
2阶段 如果需要回滚,系统根据UNDO日志来恢复到一阶段操作前的状态。如果需要提交,直接结束即可,因为一阶段已经完成实际的数据库操作。 如果协调器决定提交事务,所有参与者提交预提交的操作。如果决定回滚,则所有参与者撤销预提交的操作。

所以,他们的主要区别就在于一阶段是否直接提交事务,Seata的AT模式中,为了提升性能,直接提交了事务,在二阶段,需要回滚的话再执行回滚。而XA中,一阶段是只做资源占用,二阶段在进行回滚或者提交。

所以,AT的性能是明显高于XA的,因为在一阶段已经执行了实际的数据库操作,并不需要做资源的占用和锁定,而二阶段也只是在失败的情况下再执行回滚,所以性能相对较高。

17187877341161.jpg

而XA这种模式由于需要锁定资源直到二阶段结束,对数据库性能有较大影响,尤其在高并发环境下。

17187877283965.jpg

而在一致性方面,XA确实要比AT好的,因为在一阶段所有参与者都只进行预提交操作,二阶段再根据协调器的决定进行实际提交或回滚,确保了全局事务的一致性。

而AT这种模式,一阶段是做了数据提交的,提交后就可能被其他事物看到,那么就会出现事务被提前看到的情况。所以会存在短暂的不一致。

所以总结一下:

AT XA
性能
一致性 最终一致性 强一致性
适用场景 高吞吐量场景 高一致性要求场景,如资金、金融
复杂度 借助Seata无侵入性实现

原文: https://www.yuque.com/hollis666/xkm7k3/fzd9nmraf5krr4m0