## 分布式事务解决方案
-XA的两阶段提交
1.第一阶段: 各个操作执行完本地事务,向事务管理器返回“可以提交”;
2.第二阶段:所有操作都响应了“可以提交”,那么事务管理器会向各操作发送“提交”;(如果有任何一个操作失败,所有其他的也回滚事务)
-三阶段提交
1.第一阶段:事务管理器向各参与者,发送“是否可以提交”,参与者去看看事务是否可用;
2.第二阶段:如果参与者回复yes,事务管理器向各参与者,发送“预备提交”,参与者去执行本地事务,准备提交;
3.第三阶段:如果参与者回复“可以了”,事务管理器向各参与者发送“可以提交”,参与者去提交;
如果:第三阶段参与者没有收到“可以提交”,在等待超时后,参与者会认为该事务可以提交; --避免了两阶段提交的,发送“提交”因网络原因不可达导致数据不一致的情况
-本地消息表(源于ebay):实现了最终一致性
1.在A事务完成后,把可靠性的记录写到本地消息库中;(比如,A转账扣款100元,把B需要增加100元的信息记录到本地消息库)
2.a.使用MQ去发消息让B账户增加100元 -- 消息可能会失败
b.使用轮训消息表的方式去执行增加动作 -- 这样性能不好,做太多无用功
c. 结合a和b,先MQ去把消息发送出去,定期轮训去检测消息表;(在消息表定义一字段是否被消费来防止重复消费问题)
-阿里RocketMQ:
1.执行本地事务前,先发送prepared到消息容器中;
2.执行本地事务;
3.发送确认发送消息到消息容器中,消息容器发送消息到其他库执行其他操作;
确认消息发送失败:定期扫描消息容器,如果发现prepared消息,向发送者确认这个是否已经执行,是回滚还是发送;(可以配置的策略)
-JTA(Java Transaction API)
java在XA基础上建模的,JTA仅仅定义了接口;实现: JBoss
-世界上只有一种完美算法能保证分布式事务一致性-> Paxos 待研究?????????