在RR可重復讀隔離級別下 , InnoDB存儲引擎
當用范圍條件而不是相等條件檢索數據 , 並執行update或者delete操作
會把符合條件的范圍 , 包括條件里面不存在的記錄加上間隙鎖
當其他事務往這個范圍內插入記錄時 , 會把阻塞
例子:
事務A
set autocommit=0; //關閉自動提交
select * from message where id >10 and id <20; // 中間沒有17這個數據
update message set status="unread" where id >10 and id <20;
還沒有提交
事務B:
set autocommit=0;
insert into message (id)value(17);
事務B會被阻塞 , 直到超時
這個就是間隙鎖的作用 , 目的是防止在這個范圍內插入 , 防止出現幻讀問題
因為如果能插入成功 , 事務A查詢是看不到的 , 但是這條數據是真實存在的 , 事務A進行操作會受到新插入數據的影響 , 加上間隙鎖就ok了