3PC比2PC引入的超时机制,是什么时刻的超时?应付什么情况的超时?
文章目录1. 参与者Participant的超时**超时刻点****应对的情况**2. 协调者Coordinator的超时**超时刻点****应对的情况**3. 为什么 2PC 不敢用这种超时总结表在分布式事务中3PCThree-Phase Commit相比2PCTwo-Phase Commit的核心改进之一就是引入了双向超时机制。不仅协调者Coordinator有超时机制参与者Participant也引入了超时机制。以下是具体的时刻和应对的场景1. 参与者Participant的超时这是 3PC 最关键的改变。在 2PC 中参与者如果收不到协调者的指令会进入无限期的阻塞等待而在 3PC 中参与者在特定阶段会“主动出击”。超时刻点在PreCommit阶段之后参与者在发送完PreCommit的 ACK确认为准备就绪后如果长时间没有收到协调者发来的doCommit最终提交或abort回滚指令就会触发超时。应对的情况协调者故障/单点失效如果协调者在下发最终提交指令前宕机了或者由于网络分区导致参与者收不到指令。策略参与者一旦超时会默认执行 Commit提交操作。逻辑依据既然已经走到了PreCommit阶段说明在第一阶段CanCommit时所有参与者都已经反馈过“我没问题”。因此最终全局成功的概率极高超时提交虽然仍有风险比如协调者其实发的是回滚指令但能有效解除阻塞。2. 协调者Coordinator的超时协调者在 3PC 的三个阶段中依然保留了超时机制类似于 2PC 的逻辑。超时刻点在CanCommit阶段发出询问后等待参与者的响应。在PreCommit阶段发出预提交指令后等待参与者的 ACK。应对的情况参与者故障或网络延迟如果某个参与者挂了或者由于网络抖动没回消息。策略协调者一旦发现超时未收到全员反馈会立即判定事务失败向所有参与者发送abort中断/回滚指令。3. 为什么 2PC 不敢用这种超时你可能会问为什么 2PC 的参与者不能超时自动提交2PC 的结构缺失2PC 只有两个阶段。在第一阶段Prepare之后参与者并不知道其他人的状态。如果此时参与者超时自动提交而另一个参与者其实返回了“Fail”就会导致严重的数据不一致。3PC 的缓冲层3PC 增加的PreCommit阶段充当了“缓冲期”。进入这个阶段的前提是“第一阶段全员通过”。虽然 3PC 仍不能 100% 避免数据不一致比如协调者在第二阶段发送了回滚但某个参与者由于网络延迟没收到而超时提交了但它解决了同步阻塞问题让参与者能释放资源。总结表触发主体阶段超时后的动作解决的问题协调者CanCommit/PreCommit发送abort(中断)防止因某个参与者故障导致全局死等。参与者PreCommit之后自动执行doCommit防止因协调者宕机导致参与者长时间锁定资源解除阻塞。作为一名 Java 后端开发者理解这个对你研究Seata等分布式事务中间件的底层逻辑比如 AT 模式与 XA 模式的区别非常有帮助。3PC 虽然解决了阻塞但由于多了一次网络交互性能开销更大且依然存在脑裂导致的数据不一致问题所以现实中 XA类 2PC和 TCC 依然是主流。