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.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...