資料庫基礎
交易T1執行 SELECT COUNT(*) FROM 訂單 WHERE 金額 >= 1000,結果為8筆。緊接著T2以INSERT新增一筆金額2000的訂單並提交。T1再次執行相同的SELECT敘述,結果變為9筆。這個現象是下列何者?
- A不可重複讀取
- B髒讀
- C幻影讀取
查看答案與解析
正確答案:C. 幻影讀取
在同一筆交易中重複相同條件的搜尋時,因為期間其他交易新增(或刪除)了符合條件的資料列並提交,使結果的資料列集合改變的現象,稱為幻影讀取(Phantom read)。名稱來自新出現的資料列宛如幽靈(幻影)一般。不可重複讀取則是已讀取過的同一筆資料列,因其他交易以UPDATE或DELETE變更並提交,重新讀取時值已改變(或資料列已消失)的現象。對既有資料列所加的鎖,無法防止新增尚不存在的資料列,因此要防止幻影,需要鎖定搜尋條件所涵蓋之範圍等機制。依SQL的標準規格,把隔離等級設為SERIALIZABLE就不會發生幻影。T2已經提交,因此不是髒讀。
- A. 不可重複讀取是已讀取過之同一筆資料列的值,因其他交易的更新而改變的現象。
- B. T2已經提交,因此不是讀取提交前資料的髒讀。
- C. 正確。在相同條件的搜尋中,其他交易新增的資料列新出現的現象。