Innodb存儲引擎實現(xiàn)了兩種行級鎖:
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)宜陽免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
l 共享鎖
l 排他鎖
這兩種鎖之間的兼容關(guān)系如下圖所示
共享鎖 |
排他鎖 |
|
共享鎖 |
兼容 |
不兼容 |
排他鎖 |
不兼容 |
不兼容 |
關(guān)于行級鎖比較容易理解。下面介紹一下表級意向鎖。
Innodb存儲引擎支持多粒度的鎖定,換句話說,允許事務(wù)在表級和行級上同時持有鎖。意向鎖是一種表級鎖,它是由存儲引擎自己維護的,不需要用戶手動命令干預(yù)。如果事務(wù)想要給表中幾行數(shù)據(jù)加上行級共享鎖,那么需要先在表級別加上意向共享鎖(IS);如果事務(wù)想要給表中幾行數(shù)據(jù)加上行級排他鎖,那么需要先在表級別加上意向排他鎖(IX)。那么這兩種表級鎖有什么意義呢?
比如存在這樣一種情況。一個會話A開啟如下事務(wù),在表中的一行上面加上一行排他鎖,并且沒有提交。
MySQL> begin; Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM t_compact WHERE c1 = 'a' FOR UPDATE; +------+------+------+ | c1 | c2 | c3 | +------+------+------+ | a | aa | aaa | +------+------+------+ 1 row in set (0.00 sec) |
會話B需要給表加一個讀鎖,比如lock tables t_compact read;那么就要在表級別加共享鎖。加鎖之前需要確認(rèn)一件事,那就是表中的所有的行上面都沒有排他鎖,否則會出現(xiàn)行鎖和表鎖的共存沖突問題。如果沒有表級意向鎖的話,那么會話B需要去每一行檢查是否存在行級排他鎖,所以意向表級鎖就是用來縮短這個檢查過程的。它將檢查每一行的排他鎖變成了只要檢查一個表級鎖就可以了。
存在意向鎖之后,整個過程變成了這樣:會話A在以排他鎖鎖住一行之前,需要先加一個表級別的意向排他鎖,成功之后再在需要鎖住的那一行上面加行級排他鎖。這時會話B需要在表級別加共享鎖,這時它發(fā)現(xiàn)表上已經(jīng)存在意向排他鎖,那么說明表中已經(jīng)有數(shù)據(jù)行上有行級排他鎖,那么會話B就需要等待。
表級意向鎖相互之間是完全兼容的。
IS |
IX |
|
IS |
兼容 |
兼容 |
IX |
兼容 |
兼容 |
關(guān)于表級意向鎖互相兼容,下面的列子可以幫助理解。
仍然是表t_compact,注意表上存在一個主鍵
mysql> show create table t_compact\G *************************** 1. row *************************** Table: t_compact Create Table: CREATE TABLE `t_compact` ( `c1` varchar(10) NOT NULL, `c2` char(10) DEFAULT NULL, `c3` varchar(10) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) |
會話A,在一行上即行級排他鎖
mysql> begin; Query OK, 0 rows affected (0.00 sec)
mysql> select * FROM t_compact WHERE c1 = 'a' FOR UPDATE; +----+------+------+ | c1 | c2 | c3 | +----+------+------+ | a | aa | aaa | +----+------+------+ 1 row in set (0.00 sec) |
會話B,在另一行上加行級排他鎖。由于會話A的緣故,表上已經(jīng)存在意向排他鎖,會話B也需要在表上加意向排他鎖,由于意向鎖的兼容性,意向排他鎖也是可以加的上去的。下面再去檢查c1 = 'b'行上有沒有行級排他鎖,經(jīng)檢查沒有行級排他鎖,那么c1 = 'b'上加行級排他鎖,不會阻塞。
可是如果會話B也要在c1 = 'a'上加行級排他鎖,那么加完意向排他鎖之后,檢查行級排他鎖就會發(fā)現(xiàn)已經(jīng)存在,那么就會被阻塞。
所以,這種兼容性有助于提高并發(fā)能力。
mysql> begin; Query OK, 0 rows affected (0.00 sec)
mysql> select * FROM t_compact WHERE c1 = 'b' FOR UPDATE; +----+------+------+ | c1 | c2 | c3 | +----+------+------+ | b | bb | bbb | +----+------+------+ 1 row in set (0.00 sec) |
綜合一下行級鎖和意向表級鎖的兼容性
S |
X |
IS |
IX |
|
S |
兼容 |
不兼容 |
兼容 |
不兼容 |
X |
不兼容 |
不兼容 |
不兼容 |
不兼容 |
IS |
兼容 |
不兼容 |
兼容 |
兼容 |
IX |
不兼容 |
不兼容 |
兼容 |
兼容 |
文章名稱:Mysql鎖之行級鎖和表級意向鎖
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article4/gceioe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、App設(shè)計、網(wǎng)站設(shè)計、Google、小程序開發(fā)、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)