漫画:什么是分布式事务
单机的数据库事务用ACID即可有效进行事务管理,可分布式情况下的呢?
比如我们在打王者荣耀的时候,我们要进攻的时候会发出发起进攻/集合准备团战
,这时候大家如果都回复收到
,那么就可以发起进攻了。
队友表示已经准备就绪!
队长收到了所有人的状态,就再发起进攻!
XA两阶段
可如果有人没准备好呢?
- 有个人没血了,要回城补下血
- 队长了解了,就放弃进攻,并通知大家撤退。
换做分布式概念来讲就是
协调者
向参与者
发送prepare,参与者
执行后发送done给协调者
,但是还没commit协调者
发现所有参与者
均执行完毕,就让他们去commit,参与者
commit成功则返回ack如果失败了呢?
- 一个
参与者
执行语句失败,返回fail 协调者
向参与者
发送abort,让他们都放弃commit,保证不会出现不一致的情况,就必须得回滚了(按照undo log)
有什么不足呢?
- 需要同时考虑多个“子节点”,就要面对性能问题,需要大家都准备好才能往下执行
- 一旦“父节点”挂了,“子节点”就会收不到下一步指令,以至于“死锁”
- 可能由于网络等问题收到信息不完整/丢失,导致无法往下进行
针对不足,提出了XA三阶段
- 如果没收到commit指令,超时后会自动提交
- 为了解决性能问题,提出MQ事务,类似中间件异步执行
- TCC事务