一个无中心分布式事务架构的构思

2019-08-10注:此文作废,参见"Bag分布式事务:对SAGA分布式事务的改进 "一文,那个写的比较简单。

与Fescar这种比较复杂的、将分布式事务由一个单独的服务来支撑的架构不同,本文提出的架构不同点主要体现在以下两点:
1)它是无中心的,不需要架设单独的事务服务器,这在某些情况下,例如两个用户之间两两转账时,因为不需要中心服务器的支撑,性能高、实施容易,而且不会出现因为中心服务器的故障导致整个系统不可用的情况。
2)为简化起见,它只支持通过JDBC连接的Datasource,暂不考虑Dubbo等远程协议调用方式,因为通常分布式事务很多情况不是位于异地,而只是在同一个机房下的不同数据库之间。
因为分布式事务本身就比较复杂,本人的水平有限,可能这个架构中有什么逻辑错误没发现,还请指正。

先讲一下提交流程:
提交流程
简单说明:

  1. 整个流程以同时操作三个数据库为例,演示一个完整的分布式事务提交流程,红色字为用户必须提供的代码,蓝色部分即可以由用户实现,也可以由工具类实现,其余黑色字体部分则由工具来提供,用户不需要关心,以减少对业务的入侵。生成回滚SQL是一个比较繁琐的工作,如果完全交给工具实现(如Fescar),因为SQL的复杂性导致解晰和生成快照不是一件轻松的活,数据库兼容性有问题,目前Fescar还在改进中,距离可靠应用还有一段距离。如果交给用户,则工作量太大,不可行。我的一个初步设想是交给ORM工具层,由ORM工具来提供一些API,半自动、半手动地生成快照和回滚SQL,以达到最大的数据库兼容性。
  2. 这个分布式事务实现的原理是基于GTXID实现的全局事务锁,它是一个与业务相关的唯一ID,当GTXID一定时,即相当于锁定了相关的业务,其它需要用到这个业务资源的事务将不能重复获取这个全局事锁。 注意这是一个逻辑锁 ,并不能防范第三方或手工修改数据库字段打破数据一致性。以上概念与Fescar的全局事务锁是相通的。
  3. 对于分布式事务,它是一个拜占庭将军问题,是无解的,那么它是怎么保证事务的一致性的?在这里,不得不引入一个"事务正在处理中"这一中间状态,专门用来处理网络、硬件等故障造成的“事务有疑问”状态,工具类尽可能处理所有可能处理的情况,实在工具类不能处理时,则必须手工介入处理。以牺牲可用性来确保数据的最终一致性。
  4. 从逻辑上来说,它与Fescar的架构是等同的,只是将分布式事务服务器转移到了第一个DB上,更易于实施。在第一阶段,由程序员提供GTXID后,插入到第一个DB里,并删除以前的快照,重新生成一个数据库快照,以供回滚用,在第一个阶段,加锁逻辑、生成快照、业务逻辑是混合的。这里的第一个DB是与业务相关的,并不是固定的,通常由业务性质来决定谁是第一个DB。
  5. 如果第一阶段提交成功,则表示加锁成功,转入对其它数据库的提交。实际上,在第一个阶段,也可以将对其它数据库的事务打开,但不提交,如果有错误发生,直接将一阶段回滚,连锁都不用加了。
  6. 最后阶段,如果没有错误发生,进行解锁,运行delete from GCTX where gctxid='xxx' and status='空',如果删除成功,则整个分布式事务完成。

如果有错误发生,则会转入回滚流程:
回滚流程

回滚流程的原理与提交非常类似,而且除非是手工干预外,完全由工具类完成,这个部分就不多说了,看图就可以了。 
回滚流程的最后一步是将gctxid记录状态改为“回滚中”,防止它被删除,最后一步是执行delete from GCTX where gctxid='xxx' and status='回滚中',如果删除成功,则回滚成功,否则就需要人工干预了。通常需要人工干预的场合是软件逻辑错误、网络故障、硬件故障等。

转载于:https://my.oschina.net/drinkjava2/blog/3020260

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值