XA是一个典型的分布式事务解决方案,是一个强一致性模型,基于XA的2PC和3PC一直都是业内比较成熟的分布式方案,但是,他们都存在着各种各样的问题。
Seata中的AT模式其实和2PC很像,都是把一个分布式事务分成了2个阶段,那他们之间有什么区别呢?
主要区别就是在一阶段和二阶段做的事情上。
AT | XA | |
---|---|---|
1阶段 | 各个分支事务正常执行并提交,并记录日志,这些日志可以用来在二阶段进行回滚 | 各个分支事务执行预提交操作,数据库锁定资源但不实际提交。 |
2阶段 | 如果需要回滚,系统根据UNDO日志来恢复到一阶段操作前的状态。如果需要提交,直接结束即可,因为一阶段已经完成实际的数据库操作。 | 如果协调器决定提交事务,所有参与者提交预提交的操作。如果决定回滚,则所有参与者撤销预提交的操作。 |
所以,他们的主要区别就在于一阶段是否直接提交事务,Seata的AT模式中,为了提升性能,直接提交了事务,在二阶段,需要回滚的话再执行回滚。而XA中,一阶段是只做资源占用,二阶段在进行回滚或者提交。
所以,AT的性能是明显高于XA的,因为在一阶段已经执行了实际的数据库操作,并不需要做资源的占用和锁定,而二阶段也只是在失败的情况下再执行回滚,所以性能相对较高。
而XA这种模式由于需要锁定资源直到二阶段结束,对数据库性能有较大影响,尤其在高并发环境下。
而在一致性方面,XA确实要比AT好的,因为在一阶段所有参与者都只进行预提交操作,二阶段再根据协调器的决定进行实际提交或回滚,确保了全局事务的一致性。
而AT这种模式,一阶段是做了数据提交的,提交后就可能被其他事物看到,那么就会出现事务被提前看到的情况。所以会存在短暂的不一致。
所以总结一下:
AT | XA | |
---|---|---|
性能 | 高 | 低 |
一致性 | 最终一致性 | 强一致性 |
适用场景 | 高吞吐量场景 | 高一致性要求场景,如资金、金融 |
复杂度 | 借助Seata无侵入性实现 | 高 |