Mysql鎖之行級(jí)鎖和表級(jí)意向鎖

Innodb存儲(chǔ)引擎實(shí)現(xiàn)了兩種行級(jí)鎖:

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)宜陽(yáng)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

l   共享鎖

l   排他鎖

這兩種鎖之間的兼容關(guān)系如下圖所示


共享鎖

排他鎖

共享鎖

兼容

不兼容

排他鎖

不兼容

不兼容

關(guān)于行級(jí)鎖比較容易理解。下面介紹一下表級(jí)意向鎖。

Innodb存儲(chǔ)引擎支持多粒度的鎖定,換句話說(shuō),允許事務(wù)在表級(jí)和行級(jí)上同時(shí)持有鎖。意向鎖是一種表級(jí)鎖,它是由存儲(chǔ)引擎自己維護(hù)的,不需要用戶手動(dòng)命令干預(yù)。如果事務(wù)想要給表中幾行數(shù)據(jù)加上行級(jí)共享鎖,那么需要先在表級(jí)別加上意向共享鎖(IS);如果事務(wù)想要給表中幾行數(shù)據(jù)加上行級(jí)排他鎖,那么需要先在表級(jí)別加上意向排他鎖(IX)。那么這兩種表級(jí)鎖有什么意義呢?

比如存在這樣一種情況。一個(gè)會(huì)話A開(kāi)啟如下事務(wù),在表中的一行上面加上一行排他鎖,并且沒(méi)有提交。

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)

會(huì)話B需要給表加一個(gè)讀鎖,比如lock tables t_compact read;那么就要在表級(jí)別加共享鎖。加鎖之前需要確認(rèn)一件事,那就是表中的所有的行上面都沒(méi)有排他鎖,否則會(huì)出現(xiàn)行鎖和表鎖的共存沖突問(wèn)題。如果沒(méi)有表級(jí)意向鎖的話,那么會(huì)話B需要去每一行檢查是否存在行級(jí)排他鎖,所以意向表級(jí)鎖就是用來(lái)縮短這個(gè)檢查過(guò)程的。它將檢查每一行的排他鎖變成了只要檢查一個(gè)表級(jí)鎖就可以了。

存在意向鎖之后,整個(gè)過(guò)程變成了這樣:會(huì)話A在以排他鎖鎖住一行之前,需要先加一個(gè)表級(jí)別的意向排他鎖,成功之后再在需要鎖住的那一行上面加行級(jí)排他鎖。這時(shí)會(huì)話B需要在表級(jí)別加共享鎖,這時(shí)它發(fā)現(xiàn)表上已經(jīng)存在意向排他鎖,那么說(shuō)明表中已經(jīng)有數(shù)據(jù)行上有行級(jí)排他鎖,那么會(huì)話B就需要等待。

表級(jí)意向鎖相互之間是完全兼容的。


IS

IX

IS

兼容

兼容

IX

兼容

兼容

關(guān)于表級(jí)意向鎖互相兼容,下面的列子可以幫助理解。

仍然是表t_compact,注意表上存在一個(gè)主鍵

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)

會(huì)話A,在一行上即行級(jí)排他鎖

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)

 

會(huì)話B,在另一行上加行級(jí)排他鎖。由于會(huì)話A的緣故,表上已經(jīng)存在意向排他鎖,會(huì)話B也需要在表上加意向排他鎖,由于意向鎖的兼容性,意向排他鎖也是可以加的上去的。下面再去檢查c1 = 'b'行上有沒(méi)有行級(jí)排他鎖,經(jīng)檢查沒(méi)有行級(jí)排他鎖,那么c1 = 'b'上加行級(jí)排他鎖,不會(huì)阻塞。

可是如果會(huì)話B也要在c1 = 'a'上加行級(jí)排他鎖,那么加完意向排他鎖之后,檢查行級(jí)排他鎖就會(huì)發(fā)現(xiàn)已經(jīng)存在,那么就會(huì)被阻塞。

所以,這種兼容性有助于提高并發(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)

 

綜合一下行級(jí)鎖和意向表級(jí)鎖的兼容性


S

X

IS

IX

S

兼容

不兼容

兼容

不兼容

X

不兼容

不兼容

不兼容

不兼容

IS

兼容

不兼容

兼容

兼容

IX

不兼容

不兼容

兼容

兼容

文章名稱:Mysql鎖之行級(jí)鎖和表級(jí)意向鎖
網(wǎng)站網(wǎng)址:http://muchs.cn/article4/gceioe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)Google、小程序開(kāi)發(fā)移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化