MySQL的GAP LOCK 間隙鎖 的陷阱

2021-08-03 01:51:07 字數 2257 閱讀 6362

mysql(innodb storage engine)的行鎖主要是通過在相應的索引記錄來實現,作為乙個最佳的實踐方式就是

使用innodb的時候,最好是每個表明確定義主健,如果沒有顯式定義主健,mysql為自動建立隱含的主健。

當在某一行上加share或是exclusive鎖時,對該記錄之前(<)或是之後(>)都會被鎖定,從而無法在這些記錄

上進行操作,即使沒有行滿足條件,也會是類似的情形,

例:mysql> use frank;

mysql> create table t3 (a int primary key,b varchar(10),c int);

query ok, 0 rows affected (0.03 sec)

mysql> select * from t3;  

--insert如下記錄

+---+------+------+

| a | b    | c    |

+---+------+------+

| 5 | d    |   56 |

| 6 | df   |    6 |

| 7 | df   |    7 |

| 8 | df   |    8 |

| 9 | df   |    9 |

+---+------+------+

5 rows in set (0.00 sec)

開啟乙個會話,禁止自動提交

mysql> use frank;

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> delete from t3 where a<4;

query ok, 0 rows affected (0.00 sec)

刪除a小於4的行,從表中來看是沒有滿足a小於4的行,通過gap的屬性知道,對於a<4的行,innodb都會加鎖,一直加到等於4

開啟另乙個會話,禁止自動提交

mysql> use frank;

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> insert into t3 values(3,'df',45);

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction

可以看到由於鎖的原因已經無法insert了.

另乙個實驗,假設現有記錄情況如下:

mysql> select * from t3;

+---+------+------+

| a | b    | c   |

+---+------+------+

| 1 | df   |    4 |

| 5 | d    |   56 |

| 6 | df   |    6 |

| 7 | df   |    7 |

| 8 | df   |    8 |

| 9 | df   |    9 |

+---+------+------+

6 rows in set (0.00 sec)

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> update t3 set c=10 where a>1 and a<6;

query ok, 1 row affected (0.00 sec)

rows matched: 1  changed: 1  warnings: 0

根據gap的鎖特點在1和6之間的記錄都會被鎖定。

mysql> set autocommit=0;

query ok, 0 rows affected (0.00 sec)

mysql> insert into t3 values(4,'df',45);

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction

因為鎖等待,insert無法成功,4落在(1,6)之間,被第乙個事務的gap鎖給鎖住了。

可以看出這種gap lock的方式鎖定了不必要的行,使併發變差了.

在mysql中使用where條件的時候,要很小心.在很忙的mysql系統,使用 select ....for update 也是一種很不好的主意,一不小心帶來鎖的問題.

mysql間隙鎖 mysql的間隙鎖

最近學習了mysql的各種鎖,有點暈,打算通過文章的方式捋一捋。在學習了mvcc後,我就想,他已經很好的解決了併發讀寫了,但我也知道innodb提供了多種型別的鎖,所以很好奇這些鎖有什麼用,為什麼這些鎖的功能是mvcc做不到的?本文討論的都是rr級別下的鎖 我先建立乙個表,並插入幾行資料,如下圖 插...

mysql間隙鎖 mysql間隙鎖

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

mysql 間隙鎖 mysql間隙鎖 轉

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