Sql-Server

系統故障導致兩個事務不一致

  • July 3, 2019

在此處輸入圖像描述

假設使用者 A 的交易 4 上面的圖片。

A 更新了 Account 表中的一條記錄,將餘額從 100 更改為 0,然後出現了一個檢查點,因此所有臟頁都寫入了磁碟。

在時間 t,使用者 B 檢查 Account 表並將餘額為零的記錄添加到 Audit 表中,並在系統故障前立即送出。然後出現系統故障,所以事務4被回滾了,對於賬戶id 1234,然後餘額又是100,所以這個賬戶id不應該在Audit表中,而是因為使用者B添加了它。那麼如何解決這種不一致呢?

問題是無效的 - 事務 4 在系統故障之前送出或未送出,但您已聲明它確實送出,但隨後回滾,並且您的圖表表明事務在系統故障時仍未送出。

如果 Tran 4 在失敗之前送出,那麼它會被寫入事務日誌並在恢復期間前滾到數據庫中。對審計表的後續查詢將顯示余額為 0。

如果 Tran 4 在失敗之前沒有送出,恢復將回滾事務,隨後對審計表的查詢將顯示余額 100。

如果您的審計表必須在歷史上和事務上保持一致,則需要在更新源表的同一事務中更新審計表,以維護在兩個表之間在事務上保持一致的完美歷史記錄。

如果審計只需要最新值而不是中間值,那麼您應該編寫一個“正確”腳本,該腳本將使用源表中的最新值更新審計表,並將其作為恢復後步驟執行,甚至作為正常代理工作。

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