这段时间一直在思考分布式事务的实现,一开始的思路总是停留在应用层面上,后来经过查看相关资料才知道,要支持分布式事务得需要数据库的支持,也就还是回到了数据库层面,另外在Java里面结合javax.sql扩展包里面使用两段提交协议能轻松支持分布式事务。


    后来自己结合之前做过的一些项目,发现原来之前实现的功能已经利用消息队列把分布式事务拆解成单机事务了,虽然实时性可能没有那么强,但是正常情况下,这种思路还是比较好的一种解决方案。只是以前不知道这个概念,但是却是实现了这个功能。


    关于分布式事务的拆解的分析,案例还是上篇文章的案例,由于上篇文章主要写的重点是突出事务与并发的关系,这边文章主要想写分布式事务如何拆解成单机事务来执行,场景还是使用上篇文章的场景。


  • A系统处理一个事务后修改订单状态

  • 通过ActiveMQ通知B系统,B系统收到通知后启动一个事务来处理跟订单相关的信息,再通过ActiveMQ告知A系统

  • A系统再启动一个事务修改订单状态

  • 假设订单状态正常由第一步骤到第三步骤的状态变化为pending---finish


   假设上篇文章的bug我们已经解决,那这个流程就是一个典型的分布式事务拆解成单机事务的例子,把一个分布式事务拆分成A系统的两个单机事务和B系统的一个单机事务。A系统里面分别启动了两个事务来修改订单状态,第二个事务启动的条件是B系统的事务执行完毕并收到确认消息之后。


   然而这个流程可能有很多细节要注意,如:


  • B系统的事务执行失败,A系统如何重新启动整个流程

  • B系统如何保证幂等性

  • A系统的第二个事务启动失败,A系统如何重新启动整个流程


  以上问题都是很好解决的我们只需在应用程面多加一些异常处理机制即可保证整个流程执行顺畅。在B系统里面可以根据转态或者另外建立一张消息表以保证接口的幂等性。