微服务架构和实践Java技术升华Java开发那些事

10 分钟看懂分布式事务

2018-04-13  本文已影响325人  林檎果

什么是分布式事务

问题的引出

先看一张图,一个电商平台的架构图。


image

对于用户来说的一个创建订单的过程,背后很可能跨越了多个应用服务。涉及诸如:订单、库存、积分、优惠券等多个微服务模块,而每个模块的数据库可能存在不同节点上,但是其中的任何一个环节都有可能程序运行错误,导致数据的不一致。

image

例如这个支付操作里涉及到的多个数据库。

单一数据库可以简单的使用事务来保证一致性,但是分布式的问题则需要分布式的事务来控制数据的一致性。

分布式事务的产生的原因

事务的ACID特性

分布式事务本质也是一个事务,则需要满足ACID特性。

常见的分布式事务解决方案

两阶段提交--XA提交机制

XA提交机制
流程:
  1. 事务管理模块在prepare服务A的DB事务、服务B的DB事务都成功后。
  2. 逐个commit这些DB事务。

DB在prepare返回OK后,如果没有收到来自事务管理模块的commit/rollback请求则会一直保留该分支事务的数据。

出现错误的情况:
优点缺点

消息事务+最终一致性

image
流程

借助消息队列,在处理业务逻辑的地方,发送消息,业务逻辑处理成功后,提交消息,确保消息是发送成功的。成功后的消息去通知下一步操作的B系统服务,直到全部执行完毕。

出现错误的情况:
优点缺点

三阶段提交--TCC(Try-Confirm-Cancel)机制

image
流程:
  1. 事务管理模块是在服务A、服务B执行完毕后即刻提交其参与的DB事务。
    • 如果全局事务决定提交,则逐个调用服务A和服务B的confirm逻辑
    • 如果全局事务决定回滚,则逐个调用服务A和服务B的cancel逻辑。
出现错误的情况:
优点缺点

参考资料

  1. 分布式最终一致方案梳理,Bright Moon ‘ s Blog,https://www.cnblogs.com/BrightMoon/p/5622618.html
  2. 深入理解分布式事务,高并发下分布式事务的解决方案,mine_song,https://blog.csdn.net/mine_song/article/details/64118963
  3. 分布式服务的事务如何处理? - bytefox的回答 - 知乎,
    https://www.zhihu.com/question/29483490/answer/237665712

关于我:

linxinzhe,全栈工程师,目前供职于某500强通信企业。人工智能,区块链爱好者。

GitHub:https://github.com/linxinzhe

欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!

上一篇下一篇

猜你喜欢

热点阅读