分布式事务解决之想法
在分布式场景下,处理分布式事务有两种想法,分别是正推和逆推。
正推的想法就是在失败时,尽最大努力继续执行直到成功。
逆推的想法就是在失败时,恢复数据原样,也就是回滚。
逆推可采用如下方式实现:
二阶段事务提交
基于XA协议的两阶段提交
XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚
TCC编程模式
所谓的TCC编程模式,也是两阶段提交的一个变种。TCC提供了一个编程框架,将整个业务逻辑分为三块:Try、Confirm和Cancel三个操作。以在线下单为例,Try阶段会去扣库存,Confirm阶段则是去更新订单状态,如果更新订单失败,则进入Cancel阶段,会去恢复库存。总之,TCC就是通过代码人为实现了两阶段提交,不同的业务场景所写的代码都不一样,复杂度也不一样,因此,这种模式并不能很好地被复用。
消息事务+最终一致性
所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,同时添加一张消息记录表用来记录消息的流程状态,如果正推就采用定时轮询的方式找到未处理成功的消息重新推送或在定时中处理消息,如果逆推的话,需要记录原数据,并回滚至原数据样貌。
实际应用来说,正推更为常见。
参考https://blog.csdn.net/mine_song/article/details/64118963