讀取現象(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 方面的問題,缺點是會使效能下降。
每個隔離層級在提供不同的一致性保護和並發性能之間進行權衡。在設計應用程式時,應根據需求和性能選擇合適的隔離層級。
各家資料庫的隔離層級不盡相同