Transaction

為什麼 ARIES 崩潰後未送出的事務回滾而不是重做?

  • August 11, 2018

由於事務中的所有操作在崩潰恢復算法(如使用預寫日誌記錄的 ARIES)中都是冪等的,為什麼我們在未送出事務期間在崩潰後回滾以恢復到一致狀態,而不是僅僅重新執行整個事務?

這樣我們就可以完成事務並且我們不需要處理任何撤銷。

社區 wiki 答案- 請編輯以添加您的貢獻:

一般來說,不能保證未送出的事務實際上已經完成了它需要做的所有事情。

從 BankA 取出 100 美元但尚未將錢存入 BankB 的交易是未送出交易。如果這兩個程序之間發生崩潰,則無法確定要重做什麼,因為我們甚至沒有到達交易的存款部分,這也可能涉及其他計算和更新。

外部應用程序在程式碼中開始一個事務,並在該事務中執行多個更新、插入和刪除。在該事務的中間某處,伺服器崩潰了。現在,即使數據庫可以重放和強化在崩潰之前發生的所有更新,應用程序如何知道在其邏輯中從哪裡重新啟動?

在完全撤消中,您只需從頭開始重新啟動外部應用程序。在崩潰恢復期間處理未送出事務的絕對最安全的方法是將其回滾,就好像它從未發生過一樣。

原子性 - 事務通常由多個語句組成。原子性保證每個事務被視為一個單獨的“單元”,要麼完全成功,要麼完全失敗:如果構成事務的任何語句未能完成,則整個事務失敗,數據庫保持不變。原子系統必須保證每種情況下的原子性,包括電源故障、錯誤和崩潰。


在正確實施的 ARIES 中 - 崩潰恢復將從檢查點(儲存在主記錄中)開始,然後需要確定自檢查點以來送出的事務以及失敗的事務,然後重做所有操作,然後撤消失敗事務的影響。查看ARIES 算法恢復階段 DBMS 崩潰時會發生什麼的答案?由雷姆斯魯薩努。

另外,請記住,在崩潰期間“假定儲存在記憶體 (RAM) 中的內容已損壞或失去”,因此必須回滾。只有那些寫入磁碟的才是有效/穩定的。

這是因為根據定義,未送出的事務沒有寫出所有日誌,但與日誌相關的髒頁可能已刷新到磁碟。因此,我們必須撤消這些更改。為了撤消更改,我們必須先重做。

引用自:https://dba.stackexchange.com/questions/214626