【面試筆記摘要】數據庫事務的四大特性和隔離級別

在數據庫操作中,一項事務(Transaction)是由一條或多條操作數據庫的 SQL 語句組成的一個不可分割的工作單元,這些操作要麼都完成,要麼都取消。接下來將圍繞事務的特性、併發問題以及隔離級別進行講解。

1 事務的特性

事務的定義很嚴格,它必須同時滿足四個特性,即原子性、一致性、隔離性和持久性,也就是人們俗稱的 ACID 特性,具體如下。

1)原子性(Atomic)

表示將事務中所進行的操作捆綁成一個不可分割的單元,即對事務所進行的數據修改等操作,要麼全部執行,要麼全都不執行。

2)一致性(Consistency)

表示事務完成時,系統從一個一致的狀態轉換到另一個一致狀態。事務的一致性決定了一個系統設計和實現的複雜度,也導致了事務的不同隔離級別。

3)隔離性(Isolation)

指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

4)持久性(Durability)

持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。提交後的其他操作或故障不會對其有任何影響。

2 事務的隔離級別

在實際應用中,數據庫中的數據是要被多個用戶共同訪問的,在多個用戶同時操作相同的數據時,可能就會出現一些事務的併發問題,具體如下。

1)髒讀

指一個事務讀取到另一個事務未提交的數據。

2)不可重複讀

指一個事務對同一行數據重複讀取兩次,但得到的結果不同。

3)虛讀/幻讀

指一個事務執行兩次查詢,但第二次查詢的結果包含了第一次查詢中未出現的數據。

4)丟失更新

指兩個事務同時更新一行數據,後提交(或撤銷)的事務將之前事務提交的數據覆蓋了。

丟失更新可分爲兩類,分別是第一類丟失更新和第二類丟失更新:

  • 第一類丟失更新是指兩個事務同時操作同一個數據時,當第一個事務撤銷時,把已經提交的第二個事務的更新數據覆蓋了,第二個事務就造成了數據丟失。
  • 第二類丟失更新是指當兩個事務同時操作同一個數據時,第一個事務將修改結果成功提交後,對第二個事務已經提交的修改結果進行了覆蓋,對第二個事務造成了數據丟失。

3 標準SQL的四種事務隔離級別

爲了避免上述事務併發問題的出現,在標準的 SQL 規範中定義了四種事務隔離級別,不同的隔離級別對事務的處理有所不同。這四種事務的隔離級別如下。

1)Read Uncommitted(讀未提交)

一個事務在執行過程中,既可以訪問其他事務未提交的新插入的數據,又可以訪問未提交的修改數據。如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫操作,但允許其他事務讀此行數據。此隔離級別可防止丟失更新

2)Read Committed(讀已提交)

一個事務在執行過程中,既可以訪問其他事務成功提交的新插入的數據,又可以訪問成功修改的數據。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。此隔離級別可有效防止髒讀

3)Repeatable Read(可重複讀取)【默認】

一個事務在執行過程中,可以訪問其他事務成功提交的新插入的數據,但不可以訪問成功修改的數據。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。此隔離級別可有效防止不可重複讀和髒讀

4)Serializable(可串行化)

提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。此隔離級別可有效防止髒讀、不可重複讀和幻讀。但這個級別可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。

一般來說,事務的隔離級別越高,越能保證數據庫的完整性和一致性,但相對來說,隔離級別越高,對併發性能的影響也越大。
因此,通常將數據庫的隔離級別設置爲 Read Committed,它既能防止髒讀,又能有較好的併發性能。雖然這種隔離級別會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,但可通過在應用程序中採用悲觀鎖和樂觀鎖加以控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章