在分布式场景下,处理分布式事务有两种想法,分别是正推和逆推。
正推的想法就是在失败时,尽最大努力继续执行直到成功。
逆推的想法就是在失败时,恢复数据原样,也就是回滚。
逆推可采用如下方式实现:
二阶段事务提交
基于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
分享到:
相关推荐
收集的一些关于在现代开发运行环境(微服务等)下,解决分布式事务的论文。包括古老的saga论文,Atomikos公司Guy同学的一些想法及其它。
作为一个刚入Golang坑的普通微服务开发者所做的,很容易产生一个朴素的想法,希望Golang微服务也有分布式事务解决方案。本项目尝试将Java版的Seata改写一个Golang的版本。在Seata没有Golang版本client sdk的情况下,...
项目简介 提供基于spring-cloud系列整合的依赖jar包,比如分布式锁,接口文档,多数据源,单点登录,第三方集成等等可spring-boot配置的,简单化的使用工具。...提供mybatis与jpa多数据源配置,分布式事务。 daijie-
"对分库分表的一些想法"这一主题,正是针对这种挑战提出的一种解决方案——数据库分片技术。下面将详细讨论分库分表的概念、应用场景、实现方式以及相关工具。 分库分表,顾名思义,是指将一个大型的数据库拆分为多...
4. 分布式事务服务(支持强、弱两种模型) 5. 简单的缓存服务 6. 统一的Id服务 7. 日志服务(这部分有待扩展) 8. 密码安全服务 9. 简单的restful服务 10. 一个轻量级的配置服务 Albianj2的适用范围: ...
【Tibco EMS一些实用想法】 Tibco EMS(Enterprise Message Service)是Tibco公司提供的一款企业级消息中间件,它在分布式系统中扮演着关键角色,负责数据的高效、可靠传输。EMS作为一个异步通信平台,允许应用程序...