【发布时间】:2010-04-30 18:45:29
【问题描述】:
我目前正在探索原子提交协议(如 2PC 和 3PC)的最坏情况,但我无法弄清楚为什么 3PC 可以保证原子性。也就是说,它如何保证如果队列 A 提交,队列 B 也提交?
这是简化的3PC from the Wikipedia article:
现在让我们假设以下情况:
- 两个同类群组参与交易(A 和 B)
- 两人各司其职,然后投票支持提交
- 协调器现在发送预提交消息...
- A收到precommit消息,确认,然后长时间离线
- B 没有收到预提交消息(无论是什么原因),因此仍处于“不确定”状态
结果:
- 协调器中止事务,因为并非所有预提交消息都已成功发送和确认
- 处于 precommit 状态的 A 仍处于离线状态,因此超时并 commits
- B 中止在任何情况下:他要么保持离线并超时(导致中止),要么上线并收到协调器的中止命令
你有它:一个队列已提交,另一个已中止。 交易搞砸了。
那么我在这里错过了什么?据我了解,如果超时时的自动提交(处于预提交状态)被无限等待协调器命令所取代,那么这种情况应该可以正常工作。
【问题讨论】:
标签: transactions commit