这段时间一直在思考分布式事务的实现,一开始的思路总是停留在应用层面上,后来经过查看相关资料才知道,要支持分布式事务得需要数据库的支持,也就还是回到了数据库层面,另外在Java里面结合javax.sql扩展包,使用两段提交协议能轻松支持分布式事务。
后来自己结合之前做过的一些项目,发现原来之前实现的功能已经利用消息队列把分布式事务拆解成单机事务了,虽然实时性可能没有那么强,但是正常情况下,这种思路还是比较好的一种解决方案。只是以前不知道这个概念,但是却是实现了这个功能。
关于分布式事务的拆解的分析,案例还是上篇文章的案例,由于上篇文章主要写的重点是突出事务与并发的关系,这边文章主要想写分布式事务如何拆解成单机事务来执行,场景还是使用上篇文章的场景。
A系统处理一个事务后修改订单状态
通过ActiveMQ通知B系统,B系统收到通知后启动一个事务来处理跟订单相关的信息,再通过ActiveMQ告知A系统
A系统再启动一个事务修改订单状态
假设订单状态正常由第一步骤到第三步骤的状态变化为pending---finish
假设上篇文章的bug我们已经解决,那这个流程就是一个典型的分布式事务拆解成单机事务的例子,A系统里面分别启动了两个事务来修改订单状态,第二个事务启动的条件是B系统的事务执行完毕并收到确认消息之后。
然而这个流程可能有很多细节要注意,如:
B系统的事务执行失败,A系统如何重新启动整个流程
B系统如何保证幂等性
A系统的第二个事务启动失败,A系统如何重新启动整个流程
以上问题都是很好解决的我们只需在应用程面多加一些异常处理机制即可保证整个流程执行顺畅。在B系统里面可以根据转态或者另外建立一张消息表以保证接口的幂等性。
本文出自 “陈砚羲” 博客,请务必保留此出处http://chenyanxi.blog.51cto.com/4599355/1613037
原文地址:http://chenyanxi.blog.51cto.com/4599355/1613037