分布式事务如何拆解成单机事务

   

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


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


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


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

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

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

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


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


   然而这个流程可能有不少细节要注意,如:接口


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

  • B系统如何保证幂等性

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


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

相关文章
相关标签/搜索