漫画:什么是分布式事务

单机的数据库事务用ACID即可有效进行事务管理,可分布式情况下的呢?

比如我们在打王者荣耀的时候,我们要进攻的时候会发出发起进攻/集合准备团战,这时候大家如果都回复收到,那么就可以发起进攻了。

图片说明
队友表示已经准备就绪!
图片说明
队长收到了所有人的状态,就再发起进攻!
图片说明

XA两阶段

可如果有人没准备好呢?

图片说明

  • 有个人没血了,要回城补下血
    图片说明
  • 队长了解了,就放弃进攻,并通知大家撤退。
    图片说明

换做分布式概念来讲就是

  • 协调者参与者发送prepare,参与者执行后发送done给协调者,但是还没commit
    图片说明
  • 协调者发现所有参与者均执行完毕,就让他们去commit,参与者commit成功则返回ack
    图片说明

    如果失败了呢?

  • 一个参与者执行语句失败,返回fail
    图片说明
  • 协调者参与者发送abort,让他们都放弃commit,保证不会出现不一致的情况,就必须得回滚了(按照undo log)
    图片说明

有什么不足呢?

  • 需要同时考虑多个“子节点”,就要面对性能问题,需要大家都准备好才能往下执行
  • 一旦“父节点”挂了,“子节点”就会收不到下一步指令,以至于“死锁”
  • 可能由于网络等问题收到信息不完整/丢失,导致无法往下进行

针对不足,提出了XA三阶段

  • 如果没收到commit指令,超时后会自动提交
  • 为了解决性能问题,提出MQ事务,类似中间件异步执行
  • TCC事务