成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我打賭!這個 SQL 題,大部分人答不出來

數據庫 SQL Server
如果 update 語句更新的是索引的值,那么在運行的時候會被拆分成刪除和插入操作,這時候分析鎖的時候,要從這兩個操作的角度去分析。

大家好,我是小林。

周末的時候,一個讀者問了我一個很有意思的問題,是關于 MySQL 中 update 加鎖的問題。

他用下面這張數據庫表,做了個 MySQL 實驗的時候。

圖片

發現事務 B 的 update 不會阻塞,而事務 C 的 update 會阻塞,都是對 id = 10 這條記錄進行 update, 為什么一個會阻塞,一個不會阻塞?

圖片

首先,我們先來分析下,事務 A 這條 SQL 加了什么鎖。

// 事務 A 
select * from t_person where id < 10 for update;

我直接說結論,事務 A  加了這三個行級鎖:

  • 在 id 為 1 的主鍵索引上,加了 X 型的 next-key 鎖,范圍是 (-∞,1]。意味著,其他事務無法對 id = 1 的記錄進行刪除和更新操作,同時無法插入 id 小于 1 的新記錄。
  • 在 id 為 5 的主鍵索引上,加了 X 型的 next-key 鎖,范圍是 (1, 5]。意味著,其他事務無法對 id = 5 的記錄進行刪除和更新操作,同時無法插入 id 為 2、3、4 的新記錄。
  • 在 id 為 10 的主鍵索引上,加了 X 型的間隙鎖,范圍是 (5, 10)。意味著,其他事務無法插入 id 為 6、7、8、9 的新紀錄。

PS:如果你不清楚什么是 MySQL 這些行級鎖(記錄鎖、間隙鎖、next-key 鎖),以及不清楚行級鎖的加鎖規則,強烈建議先看我之前寫的這篇:??MySQL 是怎么加行級鎖的???,看完后,你回頭看我這篇文章,就會有感覺的了。

事務 B 的 update 語句為什么不會阻塞?

事務 B 的 update 語句是對 id = 10 的行記錄的 name 字段進行更新。

// 事務 B
update t_person set name = "小林" where id = 10;

事務 B 會在 id = 10 的主鍵索引上加 X 型記錄鎖,僅鎖住這一行。因為當我們用唯一索引進行等值查詢的時候,查詢的記錄是「存在」的,在索引樹上定位到這一條記錄后,該記錄的索引中的 next-key 鎖會退化成「記錄鎖」。

事務 A 并沒有對 id = 10 的主鍵索引上加 X 型記錄鎖,而是對 id = 10 的主鍵索引上加 X 型間隙鎖。間隙鎖和記錄鎖之間是沒有互斥關系的,所以事務 B 的 update 語句不會阻塞。

事務 C 的 update 語句為什么會阻塞?

事務 C 的 update 語句是將 id = 10 的行記錄的 id 更新為 2。

// 事務 C
update t_person set id = 2 where id = 10;

這條 update 很特殊,特殊之處在于更新了主鍵索引。你以為它只是一個更新操作,實際上它在背后執行了兩個操作:

  • 操作 1:delete from t_person where id = 10;
  • 操作 2:insert into t_person (2, 陳某,  30, 廣州市海珠區);

也就是先刪除 id = 10 的記錄,然后再插入 id = 2 的新紀錄。

為什么當 update 語句更新了索引值,會被拆分成刪除和插入操作?

要回答這個問題,我們先要清楚 B+ 樹的特點。

Innodb(MySQL 存儲引擎)在實現索引的時候,采用的數據結構是 B+ 樹。B+ 樹是基于二分查找樹演變過來的,所以 B+ 樹在存儲索引的時候,是按順序存儲的,因為這樣才能利用二分查找快速檢索到索引。

現在有一顆這樣的  B+ 樹,可以看到葉子節點的索引值是從小到大的順序。

圖片

假設這時候需要將索引值為 25 更新為 3,如果直接索引值為 25 的位置上,將值改為 3 的話。

圖片

這時候你就會發現這棵 B+ 樹不滿足順序性了!

所以更新索引的值,不能只是修改一個索引值就完事,而是還要保證更新后的索引值能繼續滿足  B+ 樹的順序性。

解決的方法就是,先刪除索引值為 25 的節點,再插入索引值為 3 的節點,這樣,這顆 B+ 樹才能滿足順序性。

圖片

事務 C 的 update  語句具體阻塞在哪個「操作」?

現在我們知道,事務 C 的 update 特殊語句背后執行了兩個操作,分別是刪除和插入操作,那具體是阻塞在哪個「操作 」?

「操作 1 」是刪除 id = 10 的記錄,事務 C 是會在 id = 10 的主鍵索引上加 X 型記錄鎖,而事務 A 并沒有對 id = 10 的主鍵索引上加 X 型記錄鎖,而是對 id = 10 的主鍵索引上加 X 型間隙鎖。間隙鎖和記錄鎖之間是沒有互斥關系的,所以「操作 1 」不會阻塞。

根據排除法,既然 「操作 1 」不會阻塞,那事務 C 的 update 語句阻塞的原因就是因為 「操作 2」發生了阻塞。

為什么「操作2」會發生阻塞呢?

我們先要知道,插入操作什么時候會發生阻塞:插入語句在插入一條新記錄之前,需要先定位到該記錄在 B+樹的位置,如果插入的位置的下一條記錄的索引上有間隙鎖,此時會生成一個插入意向鎖,然后鎖的狀態設置為等待狀態,現象就是插入語句會被阻塞。

「操作 2」插入的是 id = 2 的新記錄,在主鍵索引的 B+樹定位到插入的位置如下圖。

圖片

插入位置的下一條記錄是 id = 5 的記錄,而事務 A 在 id 為 5 的主鍵索引上已經加了 X 型的 next-key 鎖,這里面包含了間隙鎖。所以「操作 2」的插入操作會發生阻塞,這就是事務 C 的 update 語句阻塞的原因。

從這我們也可以知道間隙鎖的作用,就是阻止其他事務在間隙鎖的范圍內插入新記錄,從而避免可重復讀隔離級別下幻讀的現象。

我們也可以通過 select * from performance_schema.data_locks\G; 這條語句,查看事務 C 在加什么鎖的時候導致阻塞。

圖片

從上面的輸出信息,可以看到事務 C 在加「插入意向鎖」的時候,發生了阻塞。

插入意向鎖是插入操作才會有的鎖,而事務 C 只是執行 update 語句,卻出現了插入意向鎖,從這里也可以證明,事務 C 這條特殊的 update 語句運行的時候,被拆分成了兩個操作,一個是刪除,另一個是插入。

總之,如果 update 語句更新的是普通字段的值,就會對發生更新的記錄加 X 型記錄鎖。

但是,如果 update 語句更新的是索引的值,那么在運行的時候會被拆分成刪除和插入操作,這時候分析鎖的時候,要從這兩個操作的角度去分析。

完啦!

怎么樣,夠不夠細節?

責任編輯:武曉燕 來源: 小林coding
相關推薦

2024-10-14 08:01:09

阻塞死鎖狀態

2018-11-25 21:53:10

人工智能AI開發者

2025-01-26 16:04:09

2022-05-18 09:49:26

MySQLID數據庫

2012-06-07 16:16:43

JavaScript

2016-10-26 10:23:42

2023-09-21 15:20:49

算法開發

2016-12-22 08:38:21

2011-12-26 17:13:18

iPad統計App

2010-07-07 14:47:03

SQL Server

2024-02-26 08:37:02

Feign項目接口

2015-11-25 10:48:44

JS閉包面試題

2021-10-14 06:51:54

SpringSecurityJWT

2023-08-07 11:56:43

模型人貨場數據

2024-07-05 11:50:15

2025-06-04 11:06:54

比特幣區塊鏈挖礦

2018-08-31 07:33:58

2010-11-18 12:44:25

LibreOffice

2015-08-04 09:56:48

2021-07-26 09:43:24

代碼MapStructs項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合激情av| 免费国产一区二区 | 91麻豆蜜桃一区二区三区 | 二区av | 91人人视频在线观看 | 免费一级黄色电影 | 国产精品99久久久久久人 | 亚洲精品久久久久久一区二区 | 99九九视频| 久久久久久国产精品 | www.成人.com| 国产成人精品久久二区二区91 | 亚洲不卡| 亚洲国产成人在线视频 | 一级国产精品一级国产精品片 | 欧美一区免费 | 日韩欧美国产一区二区三区 | 盗摄精品av一区二区三区 | 精品国产一区二区国模嫣然 | 国产精品毛片一区二区在线看 | 久草免费在线视频 | 国产精品精品视频一区二区三区 | 国产女人与拘做受视频 | 亚洲欧美一区二区三区国产精品 | 日本久久网 | www.国产精 | 国产日韩欧美一区二区 | 亚洲欧美一区二区三区情侣bbw | 99福利网| 一区二区福利视频 | 成人av电影网 | 久久久人成影片一区二区三区 | 一级做a | www312aⅴ欧美在线看 | h视频免费在线观看 | 亚洲天堂av网 | 精品欧美一区二区中文字幕视频 | 欧美国产视频 | 亚洲一区二区三区四区五区中文 | av中文字幕在线 | 亚洲有码转帖 |