二、請說明下列兩種事務隔離級別的差異,並針對每種隔離級別各舉一個可 能造成資料不一致的實際情境:⑴Read Committed, ⑵Repeatable Read。 (10 分)此外,請說明為何某些資料庫系統預設使用 Read Committed 而非 Serializable。(10 分)
詳解 (共 1 筆)
以下是兩種事務隔離級別的差異及可能導致資料不一致的情境,並說明為何多數資料庫預設使用 Read Committed:
1. Read Committed(讀已提交)
• 定義:事務只能讀取其他已提交事務的資料。每個讀取語句會重新讀取資料,讀取的是最新已提交的值。
• 差異與特性:
讀取操作會看到最近一次已提交的資料,但在同一個事務中,同樣的查詢可能因其他事務提交修改而得到不同結果(不可重複讀問題)。讀取後的鎖會在語句結束時釋放,允許其他事務更新資料。
• 可能造成資料不一致的情境(不可重複讀):
假設事務A兩次查詢同一筆資料,第一次讀到數值為3。事務B在此期間更新該資料,並提交為4。事務A再次查詢時,會看到數值變為4,導致同一事務中兩次查詢結果不同。
2. Repeatable Read(可重複讀)
• 定義:事務在開始後讀取的資料快照會保持不變,保證同一事務內多次查詢結果一致。其他事務無法修改或刪除該事務所讀過的資料。
• 差異與特性:
鎖定已讀資料直到事務結束,避免不可重複讀。但仍可能因範圍新增資料行導致「幻讀」現象。
• 可能造成資料不一致的情境(幻讀):
事務A查詢符合條件的資料列集合為1筆;事務B在此期間插入一筆符合該條件的新資料並提交。事務A再次查詢時,會看到新增的資料列,導致一開始查詢時不存在的資料突然「出現」。
為什麼多數資料庫預設使用 Read Committed 而非 Serializable?
• 效能與並行度考量:
Read Committed 作為較低的隔離級別,能避免髒讀並提供適度資料一致性,同時允許較高的系統並行度和效能。反之,可序列化(Serializable)隔離級別會造成較多鎖定和等待,降低系統效率。
• 實務可接受的妥協:
雖然 Read Committed 可能導致不可重複讀和幻讀,但這類現象在多數業務場景下是可以被接受或透過應用層補救。Serializable 雖然保證最完整一致性,但代價過高且不一定必要。