MySQL數(shù)據(jù)庫意向鎖超級(jí)入門篇
在 MySQL(主要是 InnoDB 存儲(chǔ)引擎) 中,意向鎖(Intention Lock) 是一種 表級(jí)鎖,用來表示事務(wù)打算在表中的某些行上加什么類型的行鎖,從而提高鎖沖突判斷的效率。
一、為什么需要意向鎖?
InnoDB 同時(shí)支持:
- 表鎖
- 行鎖
如果沒有意向鎖,當(dāng)一個(gè)事務(wù)想給整張表加鎖時(shí),就必須 逐行檢查是否有行鎖存在,這在大表中會(huì)非常低效。
?? 意向鎖的作用:
讓數(shù)據(jù)庫 只需檢查表級(jí)的意向鎖,就能快速判斷是否可以加表鎖,而不必掃描整張表的行鎖。
二、意向鎖的類型
InnoDB 有 兩種意向鎖:
| 意向鎖類型 | 含義 |
|---|---|
| IS(Intention Shared Lock) | 表示事務(wù)打算在表中某些行上加 共享鎖(S) |
| IX(Intention Exclusive Lock) | 表示事務(wù)打算在表中某些行上加 排他鎖(X) |
三、意向鎖的工作機(jī)制
1?? 加行鎖前,先加意向鎖(表級(jí))
加行級(jí)共享鎖(S)前
→ 先在表上加 IS 鎖
加行級(jí)排他鎖(X)前
→ 先在表上加 IX 鎖
?? 意向鎖 不是用戶顯式加的,而是 InnoDB 自動(dòng)維護(hù)的
2?? 鎖兼容關(guān)系(重點(diǎn))
| IS | IX | S | X | |
|---|---|---|---|---|
| IS | ? | ? | ? | ? |
| IX | ? | ? | ? | ? |
| S | ? | ? | ? | ? |
| X | ? | ? | ? | ? |
?? 關(guān)鍵理解:
- 多個(gè)事務(wù)可以同時(shí)持有 IS / IX
- 表級(jí) S / X 鎖會(huì)與意向鎖發(fā)生沖突
- 意向鎖之間幾乎不沖突
四、舉例說明(非常重要)
示例 1:行鎖 + 意向鎖
START TRANSACTION; SELECT * FROM user WHERE id = 1 FOR UPDATE;
發(fā)生的事情:
- 在
user表上加 IX(意向排他鎖) - 在
id = 1這行上加 X(排他鎖)
示例 2:表鎖檢測(cè)沖突
LOCK TABLE user WRITE;
MySQL 只需檢查:
user表上是否存在 IS / IX
如果存在 IX,說明有事務(wù)在改某些行
?? WRITE 表鎖不能加,直接阻塞或失敗
五、意向鎖的特點(diǎn)總結(jié)
? 意向鎖是 表級(jí)鎖
? 由 InnoDB 自動(dòng)加鎖與釋放
? 不會(huì)阻塞 行鎖之間的并發(fā)
? 用于 快速判斷表鎖與行鎖是否沖突
? 是 多粒度鎖(Multi-Granularity Locking) 的核心機(jī)制
六、一句話總結(jié)
意向鎖是 InnoDB 的一種表級(jí)鎖,用來表明事務(wù)將要在表的某些行上加行鎖,從而避免在加表鎖時(shí)逐行檢查行鎖,提高鎖沖突檢測(cè)的效率。
推薦閱讀《MySQL 數(shù)據(jù)庫 意向鎖 詳解(白話篇:一看就懂)》
到此這篇關(guān)于MySQL數(shù)據(jù)庫 意向鎖超級(jí)入門篇的文章就介紹到這了,更多相關(guān)mysql意向鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql插入帶emoji表情的數(shù)據(jù)報(bào)錯(cuò)問題
在處理MySQL數(shù)據(jù)庫插入表情時(shí)出現(xiàn)錯(cuò)誤,主要可能是由三個(gè)因素引起的:1、數(shù)據(jù)庫版本號(hào)是否大于5.5.3;2、數(shù)據(jù)庫表及字段的字符集是否為utf8mb4;3、項(xiàng)目中MySQL驅(qū)動(dòng)的版本是否大于5.1.13,本文詳細(xì)講解了如何針對(duì)這三個(gè)關(guān)鍵點(diǎn)進(jìn)行排查和解決2024-11-11
MySql?InnoDB存儲(chǔ)引擎之Buffer?Pool運(yùn)行原理講解
緩沖池是用于存儲(chǔ)InnoDB表,索引和其他輔助緩沖區(qū)的緩存數(shù)據(jù)的內(nèi)存區(qū)域。緩沖池的大小對(duì)于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來多次訪問同一表數(shù)據(jù)。在專用數(shù)據(jù)庫服務(wù)器上,可以將緩沖池大小設(shè)置為計(jì)算機(jī)物理內(nèi)存大小的百分之802023-01-01
解決Navicat for MySQL 連接 MySQL 報(bào)2005錯(cuò)誤的問題
在本地MySQL的服務(wù)啟動(dòng)后,由于Navicat的一些功能需要聯(lián)網(wǎng)才可以使用,今天重點(diǎn)給大家介紹Navicat for MySQL 連接 MySQL 報(bào)2005 -Unknown MySQL server host ‘localhost’(0)錯(cuò)誤的情況與解決方法,感興趣的朋友一起看看吧2021-05-05

