故障期間的事務和數據一致性
當數據庫開始一個事務時,在該事務中執行的所有語句都是隔離的和原子的(並且是一致的和持久的)。這些幾乎是交易的定義。
Wikipedia指出,有一些數據庫通過鎖定行而不解鎖它們直到事務送出來確保事務保持隔離。
我的問題是:完全依賴鎖定的數據庫如何保證一致性?如果在事務中發生斷電,則可能有部分數據寫入該行。
即使對於像 SQL Server 這樣使用臨時數據庫來執行所有事務的數據庫,如果在數據庫將事務送出到磁碟時發生斷電會發生什麼?
數據是否損壞或數據庫是否正確處理?
請耐心等待,這是一個需要澄清的複雜問題,我們可能會經過幾輪編輯和評論來填補空白。從您提出問題的方式來看,我猜您沒有區分 ACID 的原子性、隔離性、一致性和持久性元素。
當數據庫開始一個事務時,在該事務中執行的所有語句都是隔離的和原子的(並且是一致的和持久的)。這些幾乎是交易的定義。
ACID 的隔離部分被廣泛誤解。事務相互隔離的*程度由事務隔離級別決定。*ACID 的其他元素是絕對的。
Wikipedia 指出,有一些數據庫通過鎖定行而不解鎖它們直到事務送出來確保事務保持隔離。
這與 ACID 的隔離部分有關,它對您的主要問題沒有任何影響。
我的問題是:完全依賴鎖定的數據庫如何保證一致性?如果在事務中發生斷電,則可能有部分數據寫入該行。
您的範例不關心一致性,而是持久性和原子性。這些由預寫日誌記錄(WAL) 保證。使用 WAL,所有更改在應用於數據之前都會寫入撤消/重做日誌。
在電源故障的情況下,將執行恢復過程,該過程將讀取日誌以辨識 a) 未送出的“飛行中”事務和 b) 已送出但未應用於數據的事務。a) 事務的更改被撤消(回滾),將數據返回到其事務前狀態。b) 中的更改被重做(前滾),確保數據處於預期的事務後狀態。
即使對於像 SQL Server 這樣使用臨時數據庫來執行所有事務的數據庫,如果在數據庫將事務送出到磁碟時發生斷電會發生什麼?
TempDB(假設這就是您所指的)與 SQL Server 執行事務完全無關。您是否混淆了 TempDB 在快照隔離級別中的作用?