分布式事务解决方案:基于XA协议的两阶段提交、消息事务+最终一致性、TCC编程模式
1、XA协议两阶段提交
分布式事务协议两部分:(1)事务管理器(负责本地资源提交和回滚) (2)本地资源管理器(DB实现了XA接口)。
缺点:性能不理想,无法满足高并发。mysql的XA实现,没有记录prepare阶段日志,主备切换回不一致。许多nosql也没支持XA
2、消息事务+最终一致性
基于消息中间件的两阶段提交,将本地事务和发消息放一个分布式事务,本地成功且对外发消息成功,要么都失败,RocketMQ支持
1、A系统向消息中间件发送预备消息
2、消息中间件保存预备消息并返回成功
3、A执行本地事务
4、A发送提交消息给消息中间件
步骤一、二出错,整个事务失败,不会执行A的本地操作
三出错,回滚预备消息,怎么回滚?A系统实现消息中间件回调接口,消息中间件不断执行回调接口,检查A是否成功,失败则回滚预备消息
四出错,A事务成功,通过回调接口,中间件检查A成功,不需要发消息,消息中间件提交消息,完成事务
两阶段提交用在高并发,拆成消息事务(A系统本地操作+发消息)+B本地操作,B系统操作由消息驱动,消息事务成功,A一定成功,B会收到消息执行本地操作,失败消息会重投,直到成功
3、TCC编程模式
两阶段变种,代码人为实现两阶段。Try、Confirm和Cancel。下单:Try扣库存,Confirm更新订单状态,失败,Cancel恢复库存。
总结
部分控制:变种的两阶段提交,消息事务+最终一致性、TCC模式。并发量和性能很好,一致性减弱
完全控制:完全实现两阶段提交。牺牲性能,保障一致