我知道三階段提交是爲了解決「兩階段提交」問題,當第二階段協調員和隊列同時失敗時,不可能知道協調員是否決定了提交消息。三階段提交
顯然,三階段提交旨在通過添加一個額外階段來解決此問題。但是,如果協調員和隊列失敗,那麼在第三階段你不會面對同樣的問題嗎?
我知道三階段提交是爲了解決「兩階段提交」問題,當第二階段協調員和隊列同時失敗時,不可能知道協調員是否決定了提交消息。三階段提交
顯然,三階段提交旨在通過添加一個額外階段來解決此問題。但是,如果協調員和隊列失敗,那麼在第三階段你不會面對同樣的問題嗎?
在3PC中,可以通過查詢剩餘的活動隊列來計算失敗的協調器決策。如果任何活動隊列處於預先提交狀態 - 這意味着它們都同意提交(否則協調器不會發送預先提交)。我們需要對其餘的隊列進行分組,因爲失敗的分組可能已經犯下了。
如果沒有一個隊列處於預先提交狀態 - 我們可以假定協調器沒有向任何隊列發送「提交」,所以沒有發生副作用,我們可以中止。
這裏有很好的解釋: http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/
「如果任何活動隊列處於預先-commit狀態 - 這意味着所有人都同意提交(否則協調員不會發送預先提交),並且我們需要提交其餘的隊列,因爲失敗的可能已經提交。「但是如果協調員從失敗隊列中沒有收到肯定答覆(在協調員發送預先提交後,由於延遲)併發送中止,失敗隊列收到中止,交易失敗並失敗? – user1715122
對於後人,這裏是維基百科是如何定義3階段提交:http://en.wikipedia.org/wiki/Three-phase_commit_protocol – Gray
這是文章的主旨: 的通過引入Prepared to commit狀態,三階段提交協議消除了這個問題。如果協調員在發送預先提交消息之前失敗,則該隊列會一致同意該操作已中止。協調員不會發送doCommit消息,直到所有隊列成員都確認他們已準備好提交。這消除了任何隊友在所有隊友成員意識到做出決定之前實際完成交易的可能性 – Ken
我只是不明白如何增加額外階段將有助於解決問題 – Ken