MySQL 幻讀是一種數據庫中的一類問題,它是指在某個事務中對某條記錄進行了一次更新操作,但是在提交這個事務之前,另外一個并發事務又插入了一條新數據,并且這條新數據的某些字段與之前的記錄相同。當第一個事務提交時,它會發現多了一條滿足條件的記錄,這就出現了“幻像”(Phantom)。
造成幻讀的主要原因是使用了“不可重復讀”(Non-repeatable Read)。所謂的不可重復讀是指,在同一個事務里,一個查詢的結果集可能隨著事務中其它事務的執行而發生變化。這種情況下,之前查詢出來的記錄在之后的查詢中可能查詢不到,因為另一個事務修改了這條記錄。幻讀事務在查詢時使用了 WHERE 條件,但是當這個事務進行 COMMIT 操作時,另一個事務插入了一條記錄,導致幻讀事務無法查詢到自己需要查詢到的所有記錄。
SELECT * FROM table WHERE col1 = 'value1'
-- 事務A
START TRANSACTION;
-- 對col1 = 'value1' 的數據進行更新操作
UPDATE table SET col2 = 'new_value2' WHERE col1 = 'value1';
-- 在這里 SELECT 可能返回一條數據
COMMIT;
-- 事務B
START TRANSACTION;
-- 插入一條新的數據,如果這個新數據的 col1 字段值也是'value1',添加后就會多出一條數據
INSERT INTO table(col1, col2) VALUES ('value1', 'value2');
COMMIT;
在上面這段代碼中,事務A 和事務 B 在同一個表中同時進行操作。在事務 A 中,根據特定的 WHERE 條件進行更新操作,然后提交事務。在此期間,事務 B 也提交了一條新的數據,這個新的數據滿足了事務 A 中的 WHERE 條件,所以在事務 A 提交時,會發生幻讀現象。
下一篇css清浮動的幾種方法