關係資料庫設計/事務性
ACID 是一個首字母縮略詞,代表事務系統四個最理想的基本特性:事務應該是原子性的、一致性的、隔離的和持久的。
- 原子性 事務是指要麼完全完成,要麼對資料庫不進行任何更改;即使在事務進行過程中出現錯誤或硬體故障,資料庫也不會留下一個半完成的事務。
- 一致性 事務確保在事務完成後資料庫處於一致狀態,這意味著任何完整性約束(唯一鍵、外部索引鍵、CHECK 約束等)都必須滿足,否則事務將被拒絕。
- 隔離性 事務在處理過程中對資料庫的其他使用者是不可見的。
- 永續性 事務保證在呼叫方提交它們後不會回滾。
早期的關係型資料庫管理系統無法始終保證其所有事務都滿足這四個要求,但現代的關係型資料庫管理系統通常可以提供 ACID 事務,即使在發生電源或硬體故障的情況下也是如此。
基本操作是讀取和寫入。然後是提交或中止。如果至少一項操作是對共享物件的寫入,則會發生衝突。衝突被衡量為由兩個不同事務執行的一對操作。因此,可能的組合是 RR、RW、WR、WW。
RW 會發生衝突,因為第一個 R 是一個不可重複讀,因為來自另一個事務的 W 覆蓋了 R 中讀取的先前值。
在 WR 中,第一個 W 可能在 R 之後中止,導致級聯中止,因為 W 寫入的值已被中止,而 R 正在使用來自 W 的無效值。
在 WW 中,第一個寫入是丟失更新,例如 W1W2R1 R1 丟失了更新,因為它讀取了 W2
可以實現可序列化、可恢復的排程(兩個事務的交錯排程,與兩個事務一個接一個的結果相同,並且一個事務的中止不會使另一個排程的提交無效)。
2PL - 兩階段鎖定有一個增長階段,在該階段可以獲取鎖;當鎖被釋放時,所有鎖都必須被釋放,並且不能獲取新的鎖。這確保了一個事務可以使用在鎖內獲取的讀操作來完成修改,而不會讓另一個事務執行衝突的 RW、WR 或 WW。
鎖提供獨佔訪問;這與不可搶佔性(鎖只能由鎖定事務/程序釋放)、能夠持有多個鎖以及無法檢測形成迴圈的鎖鏈相結合,會導致死鎖。
如果對鎖持有者(例如年齡)應用了排序,則可以處理死鎖,以防止迴圈發生。
基於鎖的併發控制有時被稱為悲觀,而基於時間戳的併發控制被稱為樂觀,即悲觀者預見到墨菲定律適用,因此會盡一切努力防止不良事件發生。鎖定通常意味著至少阻止了一個寫者-讀者或寫者-寫者衝突,透過獲取適當級別的鎖,並透過增長階段和釋放階段統一事務的多個更新或讀取,在這個階段,一旦釋放一個鎖,就不能獲取其他鎖。
樂觀者通常像某部動畫片中的小頭貓一樣,憑藉著無畏的膽量和好運,大多數情況下都能完成事務,而無需事先檢查。然而,作為一個合法的計算機演算法,樂觀的 timestamp 協議要求在提交時針對事務 timestamp 檢查讀取和寫入的 timestamp,不需要寫入 timestamp,有時甚至不需要在獲取的資料項上進行讀取 timestamp,這些資料項發生在事務 timestamp 之後(假設類似於單調的系統級時鐘)。因此,一個受保護的樂觀者最終可能會做很多工作,卻因為反覆中止而餓死,就像西西弗斯和他那塊石頭一樣。
多版本併發控制 (MVCC) 是一種併發方法,它擴充套件了行級鎖定,允許在不鎖定行的前提下讀取資料。在 MVCC 下,寫入資料不會覆蓋舊值,而只是建立一個新副本,並用寫入資料的事務 ID 進行標記。這允許早期的只讀事務繼續讀取舊值,這些值繼續形成資料在被覆蓋之前的一致快照。因此,早期的讀取事務不需要在資料上持有鎖。