跳至主要内容

資料庫交易隔離層級與讀取現象

· 閱讀時間約 4 分鐘
Ckai

讀取現象(Read Phenomena)

在資料庫系統中,讀取現象係指在並行處理的環境下,多個交易對同一組資料進行讀取操作時可能出現的不一致。這些不一致可能影響交易的結果或導致資料不正確。

常見的讀取現象包括:

Dirty Read(骯髒讀取)

一個交易讀取了另一個交易尚未提交的資料。如果原始交易回滾,讀取的資料就會變得無效。

Non-repeatable Read(不可重複讀取)

同一個交易內,對同一組資料進行多次讀取,但在這些讀取之間,其他交易修改了這些資料,導致每次讀取的結果不一致。

Phantom Read(幻讀)

同一個交易內,對於特定的查詢條件,多次執行 SELECT 操作,但在這些操作之間,其他交易插入、更新或刪除符合查詢條件的資料,導致每次查詢所得結果不一致。

Serialization Anomaly(序列化異常)

在並行處理的環境中,當多個交易同時操作相同的資料時,可能因操作順序不同而發生序列化異常。

以上讀取現象源自多個交易之間的並行執行。為了確保資料一致性,資料庫系統提供不同的隔離級別,以利於控制或管理讀取現象,例如 Read Uncommitted(未確定讀取)、Read Committed(已確定讀取)、Repeatable Read(可重複讀取)、 Serializable(可序列化)。

隔離層級(Isolation Levels)

在資料庫中,四個標準的隔離層級係指在同一時間多個交易(transactions)之間的互動及資料一致性保護程度。隔離層級確立交易對資料讀寫操作的可見性與互相影響的程度。

以下是四個標準隔離層級:

Read Uncommitted(未提交讀取)

最低的隔離層級,允許交易讀取其他交易尚未提交的變更,可能導致 Dirty Read。

Read Committed(提交讀取)

在此隔離層級中,交易只能讀取其他交易已經提交的變更,可避免 Dirty Read。但由於其他交易可能在交易運行期間進行更改,因此仍可能導致 Non-repeatable Read 方面的問題。

Repeatable Read(可重複讀取)

在此隔離層級中,即使其他交易對資料進行更改,仍可保證交易在運行期間讀取的所有資料都保持一致。這可以避免不可重複讀取問題,但仍然可能發生 Phantom Read 問題。

Serializable(可序列化)

最高的隔離層級,交易按照順序執行,彼此之間不會產生任何互相干擾的情況。這可以避免 Dirty Read、Non-repeatable Read、Phantom Read 方面的問題,缺點是會使效能下降。

每個隔離層級在提供不同的一致性保護和並發性能之間進行權衡。在設計應用程式時,應根據需求和性能選擇合適的隔離層級。

各家資料庫的隔離層級不盡相同

MySQL MySQL