2011-10-19 53 views
0

我感到困惑,爲什麼它被稱爲幻影查詢..例如,假設這3個查詢: -爲什麼叫幽靈查詢?

查詢1

SELECT * FROM users 
WHERE salary BETWEEN 10000 AND 300000; 

返回2個記錄。

查詢2

INSERT INTO users VALUES (3, 'Bob', 270000); 
COMMIT; 

查詢1再次

SELECT * FROM users 
WHERE salary BETWEEN 10000 AND 30000; 

返回3條記錄。

看來在我看來,正常。我不明白爲什麼他們被稱爲'幽靈讀'。所有交易都在不同的時間發生,所以我們總是得到最新的數據。最初有2條記錄,後來有1條記錄被插入..所以當我們再次運行查詢時,我們得到更新的數據,即3條記錄。那麼爲什麼它被稱爲幻影查詢。

+1

如果他們發生在3個單獨的交易,那麼它不是一個幻影。幻象問題出現在同一事務不止一次執行範圍查詢並且在兩個查詢之間插入幻像行時。 –

回答

3

在純粹的學術水平上,交易應該在交易開始時根據數據看到數據庫的一致狀態。它應該只看到自己的變化,沒有別的。

只要事務1尚未完成,看到提交的數據被視爲幻影讀取,因爲它看到事務開始時不存在的行。

由於並不總是需要這種強大的學術方法,因此引入了不同的隔離級別。根據需求,開發人員可以根據實施的業務規則選擇需要的級別。

有時你想幻讀那麼你用READ COMMITTED隔離級別(這是大多數DBMS默認),有時你不希望他們 - 那你就用SERIALIZABLE隔離級別

+1

您需要'SERIALIZABLE'而不是'REPEATABLE READ'來防止幻影。 –

+0

你說得對。我混淆了不可重複的讀取和幻像讀取。 –

1

幻讀,如果範圍鎖是發生交易中沒有很好地設置。這裏會發生什麼是你寫的 - 首先選擇將返回2行,而第二個選擇將返回3行。
按定義讀取的幻影意味着執行兩個相同的查詢,並且第二個查詢返回的行集合與第一個查詢不同。如果應用了正確的隔離,則應同時返回兩組相同的行。