寫在前面
資料庫本質上是一種共享資源,因此在最大程度提供併發訪問效能的同時,仍需要確保每個使用者能以一致的方式讀取和修改資料。鎖機制(locking)就是解決這類問題的最好**。
首先新建表 test,其中 id 為主鍵,name 為輔助索引,address 為唯一索引。
create table `test` (
`id` int(11) not null auto_increment,
`name` int(11) not null,
`address` int(11) not null,
primary key (`id`),
uniquwww.cppcns.come key `idex_unique` (`address`),
key `idx_index` (`name`)
) engine=innodb auto_increment=7 default charset=utf8mb4;
insert 方法中的行鎖
可見,如果兩個事務先後對主鍵相同的行記錄執行 insert 操作,因為事務 a 先拿到了行鎖,事務 b 只能等待直到事務 a 提交後行鎖被釋放。同理,如果針對唯一索引字段 address 進行插入操作,也需要獲取行鎖,圖同主鍵插入過程類似,不再重複。
但是,如果兩個事務都針對輔助索引字段 name 進行插入,不需要等待獲取鎖,因為輔助索引字段即使值相同,在資料庫中也是操作不同的記錄行,不會衝突。
update 方法與 insert 方法結果類似。
select for update 下的表鎖與行鎖
事務 a select for update 語句會拿到表 test 的 table lock,此時事務 b 去執行插入操作會阻塞,直到事thygudca務 a 提交釋放表鎖後,事務 b 才能獲取對應的行鎖執行插入操作。
但是如果事務 a 的 select for update 語句緊跟 where id = 1 的話,那麼這條語句只會獲取行鎖,不會是表鎖,此時不阻塞事務 b 對於其他主鍵的修改操作
輔助索引下的間隙鎖
先看下 test 表下的資料情況:
mysql> select * from test;
+----+------+---------+
| id | name | address |
+----+------+---------+
| 3 | 1 | 3 |
| 6 | 1 | 2 |
| 7 | 2 | 4 |
| 8 | 10 | 5 |
+----+------+---------+
4 rows in set (0.00 sec)
間隙鎖可以說是行鎖的一種,不同的是它鎖住的是乙個範圍內的記錄,作用是避免幻讀,即區間資料條目的突然增減。解決辦法主要是:
innodb 自動使用間隙鎖的條件為:
當 innodb 掃瞄索引記錄的時thygudca候,會首先對選中的索引行記錄加上行鎖,再對索引記錄兩邊的間隙(向左掃瞄掃到第乙個比給定引數小的值, 向右掃瞄掃瞄到第乙個比給定引數大的值, 以此構建乙個區間)加上間隙鎖。如果乙個間隙被事務 a 加了鎖,事務 b 是不能在這個間隙插入記錄的。
我們這裡所說的 「間隙鎖」 其實不是 gap lock,而是 record lock + gap lock,innodb 中稱之為 next_key lock
下面看個例子,我們建表時指定 name 列為輔助索引,目前這列的取值有 [1,2,10]。間隙範圍有 (-∞, 1]、[1,1]、[1,2]、[2,10]、[10, +∞)
round 1:
round 2:
round 3:
innodb 鎖機制總結
參考資料
總結本文標題: mysql innodb中的鎖機制深入講解
本文位址:
MySQL InnoDB事務隔離級別和鎖機制
擴充套件 在sqlserver資料庫中,並不使用索引組織表,而是使用一種稱為堆表的表型別。因此對於sqlserver來說,書籤是乙個行識別符號,用類似 檔案號 頁號 槽號 的格式來定位行資料。共享鎖 s lock 允許事務讀一行資料。排它鎖 x lock 允許事務刪除或更新一行資料。x sx不相容不...
MySQL InnoDB儲存引擎中的鎖(二)
innodb儲存引擎中有三種行鎖演算法 1.1 next key lock next key lock 是結合了gap lock 和 record lock的一種鎖定演算法,例如有乙個索引有10,11,13,20 四個值,則next key lock的鎖定區間為 10 10,11 11,13 13,...
MySQL InnoDB引擎鎖的總結
我們開的的各式各樣系統中,系統執行需要cpu 記憶體 i o 磁碟等等資源。但除了硬資源外,還有最為重要的軟資源 資料。當人們訪問操作我們的系統時,其實歸根是對資料的檢視與生產。那麼對於同乙份資料,如果多個使用者同時對它檢視 修改時會出現什麼問題呢?這必然會帶來競爭,而為了控制併發的讀取 修改資料會...