明明只改了一行語句,為啥鎖有這麼多?
我們主要從三個方面來討論這個問題:
-
啥時候加?
-
如何加?
-
什麼時候該加什麼時候不該加?
01 啥時候加
1.1 顯示鎖
▶︎ select ... for update;▶︎ select ... in share mode;
-
全域性鎖: Flush tables with read lock,主要在進行邏輯備份的時候會用到 -
表鎖: lock tables … read/write
1.2 隱式鎖
▶︎ 在對錶結構進行變更的時候,會加 MDL 寫鎖;
1.3 會不會加鎖呢?
02 怎麼加
▶︎ 讀已提交;
▶︎ 可重複讀;
▶︎ 序列化;
▶︎ 原則2:查詢過程中訪問到的物件才會加鎖。
▶︎ 最佳化1:索引上的等值查詢,給唯索引加鎖的時候,next-key lock 退化為行鎖。
▶︎ 最佳化2:索引上的等值查詢,向右遍歷時且最後一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
▶︎ 一個 bug:唯索引上的範圍查詢會訪問到不滿足條件的第一個值為止。
▶︎ gap鎖是共享的而非獨佔的。
2.1 RC
CREATE TABLE `t_db_lock` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB;
insert into t_db_lock values(0,0,0),(5,5,5),(10,10,10);
2.2 主建等值存在
▶︎ 因此當 sessionB 想插入 id=1 的記錄時會被阻塞住;
▶︎ 但是由於 sessionC 更新的是 id=5 的記錄,因此可以執行成功。
2.3 非唯 一等值
▶︎ 但是為啥這時候我更新 id=0 的資料也被阻塞了呢?因為這時除了加 a 上的索引,還有回表更新的操作,此時訪問到的主鍵上的索引也會被加鎖,因為是同一行,所以此時更新同樣被阻塞住;
▶︎ 同樣的道理,當我們去更新的 b=0 的資料對應的主鍵索引上也是同一條資料,所以此時更新也被阻塞,但是如果我們此時是更新 b=5 的這條資料的話就能更新成功。
2.4 主鍵等值不存在
▶︎ sessionB 執行成功;
▶︎ sessionC 執行成功。
2.5 無索引等值不存在
2.6 主鍵範圍
▶︎ sessionB 由於更新 id=0 這行已經上鎖的資料,所以被阻塞住;
▶︎ sessionC 由於之前 id=1 這行記錄並不存在,所以可以正常插入,這個場景是不是有點熟悉,就是我們們所說的幻讀,如果這時候在 sessionA 中再執行 select * from t_db_lock where id >= 0 and id <= 5 就會發現多了一條資料;
2.7 RR
2.8 主鍵等值存在
2.9 非唯 一等值
2.10 主鍵等值不存在
2.11 非唯 一等值不存在
2.12 主鍵範圍
2.13 非唯 一範圍
2.14 無索引等值不存在
03 什麼時候該加什麼時候不該加
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2999117/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼會有這麼多的程式語言?
- 為啥現在 996 的公司這麼多?996
- 三大主流程式語言Python為啥這麼牛?Python
- Python為啥這麼牛?跟其他語言相比究竟有什麼優勢?Python
- Python中break語句和continue語句有什麼區別?Python
- 這麼多程式語言,為何Python深受喜歡?Python
- 程式語言這麼多,為什麼建議選擇Python?Python
- 語句和表示式有什麼不同
- CPU明明8個核,網路卡為啥拼命折騰一號核?
- Python的if語句多層巢狀怎麼使用Python巢狀
- 距離-有這麼多類
- Kafka Topic 中明明有可拉取的訊息,為什麼 poll 不到Kafka
- 為啥程式會有bug?
- 好你個C語言,原來還有這麼多副面孔!C語言
- Python雖然很火,為啥找工作這麼難?Python
- 程式語言中為什麼使用分號作為語句結束符?
- 超全面 MySQL 語句加鎖分析(上篇)MySql
- 超全面 MySQL 語句加鎖分析(中篇)MySql
- 超全面 MySQL 語句加鎖分析(下篇)MySql
- 多執行緒之死鎖就是這麼簡單執行緒
- 為什麼Julia語言這麼棒?
- Python為啥這麼火?兩個字:高薪!這套教程免費領!Python高薪
- 內卷這麼嚴重,為啥大家都不考慮外逃?
- Sqlserver的merge into或delete語句堵塞select語句,鎖型別是LCK_M_ISSQLServerdelete型別
- SAP SD 交貨單明明已經做了PGI,為什麼還有Open Qty?QT
- 當執行一條select語句時,MySQL到底做了啥?MySql
- 學習Python有什麼好處?Python語言為什麼這麼受歡迎?Python
- 為什麼Java有了synchronized之後還造了Lock鎖這個輪子?Javasynchronized
- "開源"是什麼?為啥這麼火?一定免費嗎?
- 一句 Task.Result 就死鎖, 這程式碼還怎麼寫?
- 火遍全世界的Python好在哪裡?為啥這麼牛?Python
- Java 可以採用什麼語句跳出迴圈語句Java
- SQLSERVER 語句交錯引發的死鎖研究SQLServer
- Oracle:select 或 inactive 會話語句產生鎖?Oracle會話
- flask之控制語句 if 語句與for語句Flask
- python有什麼特性?為什麼這麼火?Python
- 網站被篡改了怎麼辦_網站被篡改了_把網站域名改了怎麼辦網站
- [20210301]為什麼邏輯讀這麼多.txt