2014-12-02 76 views
1

我瞭解2階段提交體系結構。讓2個奴隸和1個主人,所有準備階段都很好。當主設備提交時,提交很好。當主人要求奴隸2提交時,它失敗了。所以現在主人需要回滾整個交易。我的問題是奴隸1現在會如何rollbakc,因爲它已經承諾了?據我所知,提交是完整的和最終的。在磁盤上可能有保存點或日誌來恢復狀態,但這可能需要DBA幫助。上SO在2階段提交中回滾

參考 - Can a transaction be rolled back after it's committed and connection is closed?

回答

1

這通常是不可能的。兩階段提交的準備階段應儘可能使事務持久化,除了讓其他人可見。準備完成後,一個提交應該可以使用總是。一旦提交了兩階段提交,就不能退出。

如果已準備好的事務提交失敗(例如,因爲資源暫時不可用),那麼資源管理器應該能夠恢復事務並且重試提交。如果這是不可能的,那麼資源不支持真正的兩階段提交併且可能僞造它(例如通過忽略準備調用)。

所以成功的提交不應該回滾,但失敗的提交應該重試!

1

2相提交實際上意味着提交發生在2個階段,而不是專門在兩個數據端點。從你的例子中我得到一個印象,你認爲參與提交的2個奴隸意味着2個階段。這是不正確的。提交的第一階段(從機1迴應爲可執行的)實際上並不由從機1向下傳播。因此,基本上當從機1在階段1中表示提交時,其更多的是在存儲器中保存的備忘錄副本。它實際上並沒有對底層數據源進行提交。當Salve 2表示第一階段回滾時,主服務器發出回滾以保存1,這可以輕鬆完成,因爲沒有任何內容持續存在或傳播到下游。

但是,如果從服務器2也表示提交,則主服務器向兩個從服務器發出第二階段提交指令,以實際將提交操作下游發送到其數據源。現在參與這個行動的參與方可以是2個(就像你的例子)或者更多。您可以在網上詳細瞭解它。只需Google即可支持XA交易和2階段協議。簡而言之,第一階段更像是一個軟提交,其中每個參與的終點只是說'它是否可以執行提交'。第二階段是實際的提交。

+0

當一個系統真的支持兩階段提交時,prepare使事務最終和持久(但對其他人不可見)。那麼它應該 - 除了系統故障 - 總是可以完成提交。 – 2014-12-02 15:02:43

+0

馬克是對的。在技​​術ACID術語中,第一階段在其完成時耐用。從新手的角度來看,我會說它是一個軟性承諾。 – Nazgul 2014-12-02 15:18:51