1.引入
我們接下來的話針對一種比較特殊的數據記錄來進行一個操作,那麼就是如果在一個情況下,要求我們的數據記錄是連續的。那麼當我們的數據出現了缺失,也就是產生了間隙。那麼這一個時候又會出現什麼樣子的問題呢?,我們一起來看看。
2.什麼是間隙鎖
當我們使用範圍條件而不是相等條件檢索數據。並請求共享或排他鎖的時候,InnoDB會給符合條件的已有數據記錄的索引項添加鎖;對於鍵值範圍內但是並不存在的記錄,叫間隙(gap)。InnoDB也會對這一個"間隙"添加鎖。這一種鎖機制就是所謂的間隙鎖(Next-key鎖)。
3.間隙鎖案例測試
(1).創建測試數據庫表
DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`boyName` varchar(20) DEFAULT NULL,
`userCP` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
(2).添加數據內容並查看結果
(3).關閉數據的自動提交,測試的倆個會話都關閉自動提交
set autocommit = 0;
(4).創建倆個會話,然後測試
會話1進行對數據庫表boys範圍性的修改修改操作,能夠正常的執行
會話2進行對數據庫表boys進行單點的修改,發現處於阻塞狀態,當會話1進行提交以後,會話2操作才被執行。
這個就是間隙鎖的危害。
4.間隙鎖的危害
因爲Query在執行的過程中通過範圍的查找的話,它會鎖定整個範圍以內所有的索引鍵值,即便是這一個鍵值不存在。間隙鎖有一個比較致命的弱點,就是當鎖定一個範圍鍵值以後,在這一個範圍以內的所有鍵值都會被無辜的鎖定,而造成鎖定的 時候就無法插入鎖定的鍵值範圍以內的任何數據。在某一些場合下回造成很大的危害。