Innodb間隙鎖,細節講解

2021-08-13 09:31:24 字數 1367 閱讀 7341

關於innodb間隙鎖,網上有很多資料,在此不做贅述,我們講解一下關於innodb的間隙鎖什麼情況下會產生的問題。

網上有些資料說innodb的間隙鎖是為了防止幻讀,這個論點真的是誤人子弟。了解innodb機制的朋友就會知道,innodb實現可重複讀和防止幻讀,用的是讀取快照的方式。間隙鎖的目的只是為了事務中的防止刪除或修改不該被刪除或修改的資料而已,因此在innodb中insert語句是沒有間隙鎖的,只有在update和delete語句中才存在間隙鎖。

我們建立乙個表做下測試,表結構如下,有個主鍵,有個普通索引:

表中資料如下:

先用客戶端1執行操作:

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> update liuzhe_test set citycode=98 where no = 9;

query ok, 2 rows affected (0.00 sec)

rows matched: 2 changed: 2 warnings: 0

然後用客戶端2執行操作:

mysql> insert into liuzhe_test values(8,7,'45');
此時資料沒有執行在等待中,說明update的時候間隙鎖起了作用。

然後我們再用delete語句看下:

現在客戶端一執行操作:

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> delete from liuzhe_test where no = 9;

query ok, 2 rows affected (0.00 sec)

再用客戶端2執行操作:

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> insert into liuzhe_test values (23,13,'897');

發現還是通過間隙鎖阻塞住了。

使用insert語句是不會產生間隙鎖的。

這足以說明間隙鎖的作用是防止,在update或者delete的時候修改了後面插入的資料。

InnoDB間隙鎖簡介

mysql innodb支援三種行鎖定方式 行鎖 record lock 也叫記錄鎖,鎖直接加在索引記錄上面。間隙鎖 gap lock 鎖加在不存在的空閒空間,可以是兩個索引記錄之間,也可能是第乙個索引記錄之前或最後乙個索引之後的空間。next key lock 行鎖與間隙鎖組合起來用就叫做next...

mysql鎖 innodb間隙鎖死鎖分析

前言 在上篇裡分析了一次mysql死鎖問題,後來又深入研究了下死鎖的其他場景,innodb間隙鎖場景下也可能會發生死鎖,所以進一步鞏固下間隙鎖的知識 gap鎖定義 1.gap就是索引樹中插入新記錄的空隙 2.相應的gap鎖就是加在gap上的鎖 gap鎖作用 防止幻讀,通過間隙鎖阻止特定條件的新記錄的...

mysql間隙鎖 mysql間隙鎖

前面一文 mysql鎖 介紹了mysql innodb儲存引擎的各種鎖,本文介紹一下innodb儲存引擎的間隙鎖,就以下問題展開討論 1.什麼是間隙鎖?間隙鎖是怎樣產生的?2.間隙鎖有什麼作用?3.使用間隙鎖有什麼隱患?一 間隙鎖的基本概念 1.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...