Mysql鎖之行級鎖和表級意向鎖
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL複習筆記(05):MySQL表級鎖和行級鎖MySql筆記
- InnoDB事務鎖之行鎖-insert二級索引加鎖原理圖索引
- MySQL鎖(讀鎖、共享鎖、寫鎖、S鎖、排它鎖、獨佔鎖、X鎖、表鎖、意向鎖、自增鎖、MDL鎖、RL鎖、GL鎖、NKL鎖、插入意向鎖、間隙鎖、頁鎖、悲觀鎖、樂觀鎖、隱式鎖、顯示鎖、全域性鎖、死鎖)MySql
- 意向鎖-Oracle和MySQL中都存在OracleMySql
- MYSQL意向鎖的作用MySql
- MySQL學習之行鎖MySql
- PostgreSQL 併發控制機制(2):表級鎖和行級鎖SQL
- MySQL 行級鎖之 間隙鎖、臨鍵鎖MySql
- java 中的鎖 -- 偏向鎖、輕量級鎖、自旋鎖、重量級鎖Java
- MySQL效能優化(九)-- 鎖機制之行鎖MySql優化
- MySQL 全域性鎖和表鎖MySql
- MySQL 避免行鎖升級為表鎖——使用高效的索引MySql索引
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- 【JavaSE】淺談偏向鎖、輕量級鎖和重量級鎖,如何獲取鎖,如何撤銷鎖。Java
- 淺談偏向鎖、輕量級鎖、重量級鎖
- 執行緒和鎖,鎖升級執行緒
- Mysql在InnoDB引擎下索引失效行級鎖變表鎖案例MySql索引
- 你真的會用mysql行級鎖嗎?mysql 行級鎖全解析MySql
- 深入理解偏向鎖、輕量級鎖、重量級鎖
- mysql鎖之三種行級鎖介紹MySql
- InnoDB事務鎖之行鎖-聚集索引加鎖流程索引
- InnoDB事務鎖之行鎖-insert加鎖-隱式鎖加鎖原理
- MySQL行級鎖測試MySql
- JAVA物件分析之偏向鎖、輕量級鎖、重量級鎖升級過程Java物件
- 意向共享鎖與意向排它鎖:詳解與應用
- MySQL全域性鎖、表鎖以及行鎖MySql
- Oracle的TX鎖(行級鎖、事務鎖)Oracle
- mysql innodb 索引失效問題引起表級鎖MySql索引
- mysql事務隔離級別和鎖MySql
- MySQL學習之全域性鎖和表鎖MySql
- InnoDB事務鎖之行鎖-delete流程update階段加鎖delete
- MySQL表鎖MySql
- MySQL -- 表鎖MySql
- 全域性鎖和表鎖
- MySQL 死鎖和鎖等待MySql
- MySQL 行級鎖的使用以及死鎖的預防MySql
- 詳解 MySql InnoDB 中意向鎖的作用MySql
- InnoDB事務鎖之行鎖相關結構