據(jù)MySQL官方發(fā)布的消息,自MySQL 8.0.21版本以后,變更了默認的隔離地址,從REPEATABLE-READ變?yōu)榱丝芍貜妥x(READ-REPEATABLE)。
在MySQL之前的版本中,使用REPEATABLE-READ隔離級別會出現(xiàn)一種現(xiàn)象稱為幻讀(Phantom Read)。幻讀指的是在同一個事務中,由于并發(fā)修改導致查詢結果集增加或減少的情況。這是因為REPEATABLE-READ隔離級別只能保證SELECT語句的穩(wěn)定性和一致性,而不能保證INSERT、UPDATE、DELETE語句的穩(wěn)定性和一致性。
然而,使用READ-REPEATABLE隔離級別可以有效避免幻讀的問題。READ-REPEATABLE也被稱為MVCC(多版本并發(fā)控制),是指每個事務每次讀取的數(shù)據(jù)都為數(shù)據(jù)庫中一個確定的版本,因此不會出現(xiàn)幻讀問題。
在實際應用中,開發(fā)者可以根據(jù)實際需求選擇不同的隔離級別。但是,對于大多數(shù)應用來說,由于READ-REPEATABLE能夠避免幻讀問題,并且沒有顯著的性能影響,因此MySQL的默認隔離級別被變更為READ-REPEATABLE。
# 查看當前隔離級別 SELECT @@transaction_isolation; # 將隔離級別設置為REPEATABLE-READ SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; # 將隔離級別設置為READ-REPEATABLE SET SESSION TRANSACTION ISOLATION LEVEL READ REPEATABLE;