Phantom Problem(幻讀)問題
Phantom Problem是指同一事務下,連續執行兩次同樣的SQL語句可能導致不同的結果,第二次的SQL語句可能會返回之前不存在的行。在預設的事務隔離級別下,即REPEATABLE READ下,InnoDB儲存引擎採用Next-Key Locking機制來避免Phantom Problem(幻讀問題)。
舉個例子:
建立測試表t:
CREATE TABLE t (a INT PRIMARY KEY);
INSERT INTO t SELECT 1;
INSERT INTO t SELECT 2;
INSERT INTO t SELECT 5;
(事務隔離級別:READ COMMITED)事務T1先執行如下程式碼:
SELECT * FROM t WHERE a>2 FOR UPDATE;
這是事務T1並沒有進行commit操作;應該返回a=5這個結果;假如與此同時,另一個事務T2插入了4這個值,並且資料庫允許該操作,那麼事務T1再次執行上述SQL語句會得到結果4和5。這與第一次得到的結果不同,違反了事務的隔離性,即當前事務能夠看到其他事務的結果。其過程如下:
InnoDB儲存引擎採用Next-Key Locking的演算法來避免Phantom Problem。對於上述的SQL語句SELECT * FROM t WHERE a>2 FOR UPDATE,其鎖住的不是5這個單值,而是對(2,+ ∞ )這個單位加了X鎖(排它鎖)。因此任何對於這個範圍的插入都是不允許的。從而避免了Phantom Problem。
InnoDB儲存引擎預設的事務隔離級別是REPEATABLE READ,採用Next-Key Locking(鎖定一個範圍,並且鎖定記錄本身)的方式加鎖。而在事務隔離級別READ-COMMITED下,僅採用Record Lock(單個行記錄上的鎖),因此在上述栗子中,會話A需要將事務的隔離級別設定為READ-COMMITED。
相關文章
- MySQL rr下幻讀問題分析MySql
- MySQL是怎麼解決幻讀問題的?MySql
- 髒讀!幻讀!不可重複讀!mysql併發事務引發的問題MySql
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- 最大子陣列問題(Maximum subarray problem)陣列
- Problem E - Steps(問題e-步驟)
- 人工智慧的人類問題(The human problem of AI)人工智慧AI
- MySQL 8.0 Reference Manual(讀書筆記67節--Phantom Rows)MySql筆記
- 髒讀,幻讀,不可重複讀
- MySQL 透過 Next-Key Locking 技術(行鎖+間隙鎖)避免幻讀問題MySql
- 髒讀、幻讀和不可重複讀
- 髒讀、幻讀和不可重複讀?為啥?
- 什麼是髒讀,不可重複讀,幻讀
- 【組合數學】幻方、拉丁方、塗色問題
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- 動態規劃法(六)雞蛋掉落問題(一)(egg dropping problem)動態規劃
- 修復 SSL Certificate Problem,如何定位及常見問題的處理策略
- CF1603E A Perfect Problem 題解
- CF1618G Trader Problem 題解
- ABC353C Sigma Problem 題解
- 一文詳解髒讀、不可重複讀、幻讀
- AI 閘道器零程式碼解決 AI 幻覺問題AI
- InnoDB 是如何解決幻讀的
- JUC之讀寫鎖問題
- 【Mysql】資料庫事務,髒讀、幻讀、不可重複讀MySql資料庫
- ABC365E Xor Sigma Problem 題解
- CF1982F Sorting Problem Again 題解AI
- 原創題目 白銀之春 Problem and Solution
- MySQL的可重複讀級別能解決幻讀嗎MySql
- [CF1188E] Problem from Red Panda 題解
- CF1934B Yet Another Coin Problem 題解
- Mathematical Problem
- Sum Problem
- MySQL 事務隔離實驗-認識:髒讀、不可重複讀、幻讀MySql
- 資料庫事務隔離級別– 髒讀、幻讀、不可重複讀資料庫
- MySQL鎖問題分析-全域性讀鎖MySql
- python讀入不定行字元的問題Python字元
- 雙埠SRAM中讀干擾問題