Mysql鎖之行級鎖和表級意向鎖

水逸冰發表於2019-07-08

Innodb儲存引擎實現了兩種行級鎖:

l   共享鎖

l   排他鎖

這兩種鎖之間的相容關係如下圖所示


共享鎖

排他鎖

共享鎖

相容

不相容

排他鎖

不相容

不相容

關於行級鎖比較容易理解。下面介紹一下表級意向鎖。

Innodb儲存引擎支援多粒度的鎖定,換句話說,允許事務在表級和行級上同時持有鎖。意向鎖是一種表級鎖,它是由儲存引擎自己維護的,不需要使用者手動命令干預。如果事務想要給表中幾行資料加上行級共享鎖,那麼需要先在表級別加上意向共享鎖(IS);如果事務想要給表中幾行資料加上行級排他鎖,那麼需要先在表級別加上意向排他鎖(IX)。那麼這兩種表級鎖有什麼意義呢?

比如存在這樣一種情況。一個會話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需要給表加一個讀鎖,比如lock tables t_compact read;那麼就要在表級別加共享鎖。加鎖之前需要確認一件事,那就是表中的所有的行上面都沒有排他鎖,否則會出現行鎖和表鎖的共存衝突問題。如果沒有表級意向鎖的話,那麼會話B需要去每一行檢查是否存在行級排他鎖,所以意向表級鎖就是用來縮短這個檢查過程的。它將檢查每一行的排他鎖變成了只要檢查一個表級鎖就可以了。

存在意向鎖之後,整個過程變成了這樣:會話A在以排他鎖鎖住一行之前,需要先加一個表級別的意向排他鎖,成功之後再在需要鎖住的那一行上面加行級排他鎖。這時會話B需要在表級別加共享鎖,這時它發現表上已經存在意向排他鎖,那麼說明表中已經有資料行上有行級排他鎖,那麼會話B就需要等待。

表級意向鎖相互之間是完全相容的。


IS

IX

IS

相容

相容

IX

相容

相容

關於表級意向鎖互相相容,下面的列子可以幫助理解。

仍然是表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的緣故,表上已經存在意向排他鎖,會話B也需要在表上加意向排他鎖,由於意向鎖的相容性,意向排他鎖也是可以加的上去的。下面再去檢查c1 = 'b'行上有沒有行級排他鎖,經檢查沒有行級排他鎖,那麼c1 = 'b'上加行級排他鎖,不會阻塞。

可是如果會話B也要在c1 = 'a'上加行級排他鎖,那麼加完意向排他鎖之後,檢查行級排他鎖就會發現已經存在,那麼就會被阻塞。

所以,這種相容性有助於提高併發能力。

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

不相容

不相容

相容

相容


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31480688/viewspace-2649912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章