常见的分布式事务解决方案:
1、基于数据库XA/JTA协议的方式: 需要数据库厂商支持;java组件有atomikos等
2、异步校对数据的方式: 支付宝、微信支付主动查询支付状态、对账单的形式
3、基于可靠消息的MQ解决方案: 异步场景;通用性强;扩展性较高
4、TCC编程式解决方案: 严选、阿里自己封装的DTX
课外读物:
https://my.oschina.net/dyyweb/blog/1633373
错误场景:
调用接口失败时,订单系统事务回滚,提示用户操作失败
误以为这样的接口调用写法,就不会有分布式事务问题
问题:
1、运单系统可能已经进行执行操作,接口发生了异常(超时),订单系统数据进行回滚,导致数据不一致
2、接口成功,订单系统事务提交失败,运单系统没有回滚,数据不一致
解决步骤
总结
优点:
1、通用性强
2、拓展性强
3、方案成熟
缺点:
1、基于消息中间件,只适用于异步场景(任务必须成功: 如,付了钱,必须有订单,有运单人)
2、消息处理会有延迟,需要业务上能容忍
尽量避免分布式事务
尽量将非核心事务做成异步(如扣钱,转账等还是同步)