精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節二面,兩個事務執行 SQL 語句的過程中,導致死鎖

數據庫 MySQL
如果對 MySQL 加鎖機制比較熟悉的同學,應該一眼就能看出會發生死鎖。但是具體加了什么鎖而導致死鎖,是需要我們具體分析的。接下來,就跟聊聊上面兩個事務執行 SQL 語句的過程中,加了什么鎖,從而導致死鎖的。

大家好,我是小林。

之前收到讀者面試字節時,被問到一個關于 MySQL 的問題。

圖片

圖片

如果對 MySQL 加鎖機制比較熟悉的同學,應該一眼就能看出會發生死鎖。

但是具體加了什么鎖而導致死鎖,是需要我們具體分析的。

接下來,就跟聊聊上面兩個事務執行 SQL 語句的過程中,加了什么鎖,從而導致死鎖的。

準備工作

先創建一張 t_student 表,假設除了 id 字段,其他字段都是普通字段。

CREATE TABLE `t_student` (
`id` int NOT NULL,
`no` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
`score` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后,插入相關的數據后,t_student 表中的記錄如下:

圖片

開始實驗

在實驗開始前,先說明下實驗環境:

  • MySQL 版本:8.0.26
  • 隔離級別:可重復讀(RR)

啟動兩個事務,按照題目的 SQL 執行順序,過程如下表格:

圖片

可以看到,事務 A 和 事務 B 都在執行  insert 語句后,都陷入了等待狀態(前提沒有打開死鎖檢測),也就是發生了死鎖,因為都在相互等待對方釋放鎖。

為什么會發生死鎖?

我們可以通過 select * from performance_schema.data_locks\G; 這條語句,查看事務執行 SQL 過程中加了什么鎖。

接下來,針對每一條 SQL 語句分析具體加了什么鎖。

Time 1 階段加鎖分析

Time 1 階段,事務 A 執行以下語句:

# 事務 A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_student set score = 100 where id = 25;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0 Changed: 0 Warnings: 0

然后執行 select * from performance_schema.data_locks\G; 這條語句,查看事務 A 此時加了什么鎖。

圖片

從上圖可以看到,共加了兩個鎖,分別是:

  • 表鎖:X 類型的意向鎖;
  • 行鎖:X 類型的間隙鎖;

這里我們重點關注行鎖,圖中 LOCK_TYPE 中的 RECORD 表示行級鎖,而不是記錄鎖的意思,通過 LOCK_MODE 可以確認是 next-key 鎖,還是間隙鎖,還是記錄鎖:

  • 如果 LOCK_MODE 為X,說明是 next-key 鎖;
  • 如果 LOCK_MODE 為X, REC_NOT_GAP,說明是記錄鎖;
  • 如果 LOCK_MODE 為X, GAP,說明是間隙鎖;

因此,此時事務 A 在主鍵索引(INDEX_NAME : PRIMARY)上加的是間隙鎖,鎖范圍是(20, 30)。

Time 2 階段加鎖分析

Time 2 階段,事務 B 執行以下語句:

# 事務 B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_student set score = 100 where id = 26;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0 Changed: 0 Warnings: 0

然后執行 select * from performance_schema.data_locks\G; 這條語句,查看事務 B 此時加了什么鎖。

圖片

從上圖可以看到,共加了兩個鎖,分別是:

  • 表鎖:X 類型的意向鎖;
  • 行鎖:X 類型的間隙鎖;

因此,此時事務 B 在主鍵索引(INDEX_NAME : PRIMARY)上加的是間隙鎖,鎖范圍是(20, 30)。

事務 A 和 事務 B 的間隙鎖范圍都是一樣的,為什么不會沖突?

兩個事務的間隙鎖之間是相互兼容的,不會產生沖突。

在MySQL官網上還有一段非常關鍵的描述:

Gap locks in InnoDB are “purely inhibitive”, which means that their only purpose is to prevent other transactions from Inserting to the gap. Gap locks can co-exist. A gap lock taken by one transaction does not prevent another transaction from taking a gap lock on the same gap. There is no difference between shared and exclusive gap locks. They do not conflict with each other, and they perform the same function.

間隙鎖的意義只在于阻止區間被插入,因此是可以共存的。一個事務獲取的間隙鎖不會阻止另一個事務獲取同一個間隙范圍的間隙鎖,共享和排他的間隙鎖是沒有區別的,他們相互不沖突,且功能相同。

Time 3 階段加鎖分析

Time 3,事務 A 插入了一條記錄:

# Time 3 階段,事務 A 插入了一條記錄
mysql> insert into t_student(id, no, name, age,score) value (25, 'S0025', 'sony', 28, 90);
/// 阻塞等待......

此時,事務 A 就陷入了等待狀態。

然后執行 select * from performance_schema.data_locks\G; 這條語句,查看事務 A 在獲取什么鎖而導致被阻塞。

圖片

可以看到,事務 A 的狀態為等待狀態(LOCK_STATUS: WAITING),因為向事務 B 生成的間隙鎖(范圍 (20, 30)?)中插入了一條記錄,所以事務 A 的插入操作生成了一個插入意向鎖(LOCK_MODE:INSERT_INTENTION)。

插入意向鎖是什么?

注意!插入意向鎖名字里雖然有意向鎖這三個字,但是它并不是意向鎖,它屬于行級鎖,是一種特殊的間隙鎖。

在MySQL的官方文檔中有以下重要描述:

An Insert intention lock is a type of gap lock set by Insert operations prior to row Insertion. This lock signals the intent to Insert in such a way that multiple transactions Inserting into the same index gap need not wait for each other if they are not Inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to Insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with Insert intention locks prior to obtaining the exclusive lock on the Inserted row, but do not block each other because the rows are nonconflicting.

這段話表明盡管插入意向鎖是一種特殊的間隙鎖,但不同于間隙鎖的是,該鎖只用于并發插入操作。

如果說間隙鎖鎖住的是一個區間,那么「插入意向鎖」鎖住的就是一個點。因而從這個角度來說,插入意向鎖確實是一種特殊的間隙鎖。

插入意向鎖與間隙鎖的另一個非常重要的差別是:盡管「插入意向鎖」也屬于間隙鎖,但兩個事務卻不能在同一時間內,一個擁有間隙鎖,另一個擁有該間隙區間內的插入意向鎖(當然,插入意向鎖如果不在間隙鎖區間內則是可以的)。所以,插入意向鎖和間隙鎖之間是沖突的。

另外,我補充一點,插入意向鎖的生成時機:

每插入一條新記錄,都需要看一下待插入記錄的下一條記錄上是否已經被加了間隙鎖,如果已加間隙鎖,那 Insert 語句會被阻塞,并生成一個插入意向鎖 。

Time 4 階段加鎖分析

Time 4,事務 B 插入了一條記錄:

# Time 4 階段,事務 B 插入了一條記錄
mysql> insert into t_student(id, no, name, age,score) value (26, 'S0026', 'ace', 28, 90);
/// 阻塞等待......

此時,事務 B 就陷入了等待狀態。

然后執行 select * from performance_schema.data_locks\G; 這條語句,查看事務 B 在獲取什么鎖而導致被阻塞。

圖片

可以看到,事務 B 在生成插入意向鎖時而導致被阻塞,這是因為事務 B 向事務 A 生成的間隙鎖(范圍 (20, 30))中插入了一條記錄,而插入意向鎖和間隙鎖是沖突的,所以事務  B 在獲取插入意向鎖時就陷入了等待狀態。

最后回答,為什么會發生死鎖?

本次案例中,事務 A 和事務 B 在執行完后 update 語句后都持有范圍為(20, 30)的間隙鎖,而接下來的插入操作為了獲取到插入意向鎖,都在等待對方事務的間隙鎖釋放,于是就造成了循環等待,滿足了死鎖的四個條件:互斥、占有且等待、不可強占用、循環等待,因此發生了死鎖。

總結

兩個事務即使生成的間隙鎖的范圍是一樣的,也不會發生沖突,因為間隙鎖目的是為了防止其他事務插入數據,因此間隙鎖與間隙鎖之間是相互兼容的。

在執行插入語句時,如果插入的記錄在其他事務持有間隙鎖范圍內,插入語句就會被阻塞,因為插入語句在碰到間隙鎖時,會生成一個插入意向鎖,然后插入意向鎖和間隙鎖之間是互斥的關系。

如果兩個事務分別向對方持有的間隙鎖范圍內插入一條記錄,而插入操作為了獲取到插入意向鎖,都在等待對方事務的間隙鎖釋放,于是就造成了循環等待,滿足了死鎖的四個條件:互斥、占有且等待、不可強占用、循環等待,因此發生了死鎖。

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

2024-08-27 22:04:37

2024-11-20 08:00:00

死鎖多線程編程

2023-06-14 08:34:18

Mybatis死鎖框架

2011-04-11 17:28:50

oracle存儲select語句

2011-07-20 18:00:15

MySQL數據庫字符集

2010-09-06 10:52:27

sql server語句

2010-04-29 14:06:40

Oracle SQL

2010-09-06 11:24:32

SQL Server語句

2010-09-07 15:04:21

SQL語句存儲過程

2017-10-16 10:59:15

系統存儲SQL Serve

2010-11-12 09:18:13

SQL Server存

2010-09-07 11:41:24

SQL語句

2009-07-06 15:06:20

ASP.NET開發程序

2023-11-09 11:56:28

MySQL死鎖

2022-09-01 16:42:47

MySQL數據庫架構

2010-11-09 16:20:46

SQL Server死

2011-08-15 15:56:31

SQL Server

2022-12-13 18:09:25

連接狀態客戶端

2024-12-27 00:00:00

SQL死鎖數據庫

2010-05-07 18:44:28

Oracle存儲過程
點贊
收藏

51CTO技術棧公眾號

亚洲大片在线观看| 波多野洁衣一区| 亚洲精品一区二区三区香蕉| 青青草成人免费在线视频| 亚洲天堂aaa| 国产精品观看| 精品国产乱码久久久久久影片| 麻豆中文字幕在线观看| 天天干天天舔天天射| 奇米色一区二区| 久久久欧美精品| 精品人妻中文无码av在线| 伊人久久影院| 欧美日韩精品一区二区三区 | 亚洲系列另类av| 91精品国产综合久久久久久久 | 久色视频在线| 成人性生交大片免费看无遮挡aⅴ| 污视频网站免费观看| 伊人久久综合| 精品亚洲精品福利线在观看| 成人亚洲免费视频| 成人线上视频| 亚洲成人资源在线| 裸体大乳女做爰69| 91在线不卡| 久久午夜电影网| 国产欧美日韩一区| 国产aⅴ一区二区三区| 日韩电影免费在线看| 韩国三级日本三级少妇99| 黄色录像二级片| julia中文字幕一区二区99在线| 一区二区在线观看免费| 国产精品播放| 国产三级伦理片| 久热成人在线视频| 国产成人在线精品| 天堂中文字幕在线观看| 亚洲调教视频在线观看| 美女精品视频一区| 少妇精品一区二区| 国产一区二区三区亚洲| 欧美怡红院视频| 国产精品88久久久久久妇女 | 精品国产乱码久久久久久久| 久久无码高潮喷水| a√中文在线观看| 亚洲一区二区在线观看视频| 日本一道在线观看| 曰本三级在线| 一区二区三区免费观看| 国产乱子伦精品视频| 三级国产在线观看| 久久综合资源网| 日本在线播放一区| 国产福利电影在线| 成人不卡免费av| 国产精品二区二区三区| 可以免费看毛片的网站| 成人av中文字幕| 精品免费二区三区三区高中清不卡| 久久午夜鲁丝片| 免费欧美在线视频| 成人黄色激情网| 国产精品视频第一页| 亚洲一区区二区| 久久精品亚洲94久久精品| 538精品在线视频| 日韩夫妻性生活xx| 久久久精品免费| 久久中文字幕无码| 亚洲影音一区| 国产欧美日韩高清| 亚洲av无码一区二区乱子伦| av一区二区三区四区| 欧美日韩精品久久| 欧洲美女少妇精品| 一级日本不卡的影视| 五月天综合婷婷| 欧美xxxx黑人又粗又长| 精品国产91久久久| 污污的网站18| 亚洲一区二区电影| 亚洲乱码一区av黑人高潮| 国产精品久久久久久久av| 91精品精品| 欧美一级大片在线免费观看| 一级特黄色大片| 成人动漫一区二区在线| 天堂资源在线亚洲视频| 3d玉蒲团在线观看| 色婷婷国产精品久久包臀| av噜噜在线观看| 欧美日韩看看2015永久免费 | 亚洲国产合集| 久久五月情影视| 国产 日韩 欧美 在线| 精品一区二区三区在线视频| 国产一区二区三区四区五区加勒比| 亚洲精品国产一区二| 久久精品男人的天堂| 男人添女荫道口女人有什么感觉| h片在线免费| 欧美午夜性色大片在线观看| 日韩一级免费片| 久久亚洲道色| 另类色图亚洲色图| 毛片视频网站在线观看| 国产一区二区三区久久悠悠色av| 91精品天堂| wwwww在线观看免费视频| 国产精品美女久久久久高潮| 少妇无码av无码专区在线观看| 色吧亚洲日本| 日韩一级二级三级| 国产三级短视频| 亚洲精品888| 国产精品免费看久久久香蕉| 亚洲aaa在线观看| 国产欧美日韩亚州综合 | 911av视频| 欧美日韩国产高清电影| 992tv成人免费视频| 中文字幕高清在线免费播放| 成人性生交大合| 制服国产精品| 日韩成人精品一区二区三区| 亚洲欧美色图片| 国产 欧美 日韩 在线| 日本不卡的三区四区五区| 成人黄色片网站| av免费观看一区二区| 色婷婷综合五月| 亚洲乱码国产乱码精品精大量| 日韩精品第一区| 国产精品伦子伦免费视频| av中文在线观看| 国产精品久久久久久久久免费相片 | 性感美女视频一二三| 亚洲一区二区三区四区在线| 免费在线观看污网站| 青青草原综合久久大伊人精品| 欧美黄色三级网站| av网站免费大全| 亚洲久草在线视频| 99精品视频免费版的特色功能| 嫩草国产精品入口| 精品国产一区二区三区在线观看 | 免费日韩电影在线观看| 日韩理论视频| 亚洲免费影视第一页| 免费看毛片网站| 岛国av在线一区| 久草免费福利在线| 国产ts一区| 欧美综合激情网| 久久久资源网| 欧美日韩免费一区二区三区 | 国产精品国产三级国产普通话蜜臀 | 欧美视频国产精品| 久操视频免费看| 日韩高清不卡在线| 自拍偷拍一区二区三区| 欧美成年网站| 国内精品伊人久久| 日韩午夜影院| 欧美日韩成人在线| 九九热精彩视频| 91色porny蝌蚪| 冲田杏梨av在线| 欧美一区网站| 国产一区二区无遮挡| 欧美粗大gay| 久久天天躁狠狠躁夜夜爽蜜月| 波多野结衣在线观看一区| 中国av一区二区三区| 色男人天堂av| 午夜宅男久久久| 亚洲午夜精品一区二区| 亚洲一区二区三区四区电影| 欧美一级视频一区二区| av在线天堂播放| 欧美刺激午夜性久久久久久久| 日本成人免费视频| 三级久久三级久久久| 亚洲综合激情五月| 老牛精品亚洲成av人片| 国产精品欧美日韩久久| jyzzz在线观看视频| 欧美一区二区三区思思人| 朝桐光av在线| 久久午夜羞羞影院免费观看| 中文字幕55页| 亚洲午夜精品久久久久久app| 5g国产欧美日韩视频| 在线免费观看的av| 欧美成人欧美edvon| 国产寡妇亲子伦一区二区三区四区| 91论坛在线播放| 99九九精品视频| 久久aⅴ国产紧身牛仔裤| 欧洲精品国产| heyzo欧美激情| 国产欧美日韩高清| 97caopor国产在线视频| 亚洲天堂久久av| 刘亦菲久久免费一区二区| 亚洲成人自拍偷拍| 中文字幕在线有码| 欧美—级在线免费片| 污污视频网站在线| 丝袜亚洲另类丝袜在线| 青草视频在线观看视频| 亚洲精品久久久| 色综合电影网| 精品午夜av| 国产精品久久久久久影视| 免费大片在线观看www| 精品亚洲夜色av98在线观看| 俄罗斯嫩小性bbwbbw| 9191国产精品| 亚洲永久精品视频| 在线观看国产91| 国产区一区二区三| 天天综合色天天综合| 免费人成视频在线| 亚洲精品视频在线看| 日本美女黄色一级片| 欧美激情一区二区三区不卡| 法国伦理少妇愉情| 91蜜桃在线免费视频| 国产人妻黑人一区二区三区| 国产精品一区二区三区99| 国产亚洲视频一区| 黄网站免费久久| 国产成年人视频网站| 六月丁香婷婷久久| 男女视频在线看| 麻豆一区二区三| 男女超爽视频免费播放| 尤物在线精品| 国产小视频免费| 亚洲激情二区| 精品久久一二三| 国产精品综合| 男人的天堂视频在线| 色综合天天综合网中文字幕| 一区一区视频| 亚洲久久久久| 欧美午夜性视频| 国产亚洲激情| 热久久精品国产| 理论电影国产精品| 一区二区三区四区毛片| 九九九久久久精品| 中文字幕第六页| 蜜臀av一区二区在线观看| 日本xxxx黄色| 亚洲综合另类| 五月婷婷之综合激情| 久久精品999| 欧美伦理片在线看| 精品夜夜嗨av一区二区三区| 久久艹这里只有精品| 成人综合在线网站| 中文字幕在线看高清电影| 中文字幕不卡在线播放| 黄色片网站在线播放| 一区二区三区免费看视频| 日韩精品在线免费看| 日本精品一级二级| 国产精品无码久久久久成人app| 91官网在线观看| 国产裸体永久免费无遮挡| 日韩精品中文字幕在线一区| 国产精品一区二区av白丝下载 | 黄色网址中文字幕| 欧美精品亚洲二区| 欧洲成人一区二区三区| 日韩欧美的一区| 无码国产精品高潮久久99| 一区二区三区四区在线观看视频| 色综合久久网女同蕾丝边| 最近2019免费中文字幕视频三| 国产黄在线播放| 美女精品视频一区| 成人小电影网站| 7777精品久久久大香线蕉小说| 少妇高潮一区二区三区99| 国产精品v欧美精品v日韩精品| 中文字幕一区二区三区中文字幕| 亚洲精品日韩av| 国产成人精品亚洲日本在线观看| 人九九综合九九宗合| 午夜精品久久久久久毛片| 国产尤物99| 午夜精品影视国产一区在线麻豆| 精品国产一区二区三区麻豆免费观看完整版 | caoporn免费在线视频| 91成人在线播放| 中文字幕日韩亚洲| 欧美精彩一区二区三区| 你懂的国产精品| 欧美一级裸体视频| 99麻豆久久久国产精品免费优播| 免费a级黄色片| 亚洲最新在线观看| ,亚洲人成毛片在线播放| 日韩av在线资源| 欧美性video| 成人黄在线观看| 欧美日韩在线播放视频| 一女被多男玩喷潮视频| 国产精品99久久久久| 国产美女网站视频| 色噜噜狠狠一区二区三区果冻| 中文字幕日韩经典| 亚洲精品一区中文字幕乱码| 91大神xh98hx在线播放| 免费97视频在线精品国自产拍| www中文字幕在线观看| 91九色单男在线观看| 欧美亚洲国产精品久久| 免费观看精品视频| 看电视剧不卡顿的网站| 欧美日韩高清丝袜| 欧美丝袜美女中出在线| 全国男人的天堂网| 欧美激情影音先锋| 日韩精品成人在线观看| 久久久99爱| 国产精品久久久久久模特| 中日韩av在线播放| 中文无字幕一区二区三区| 国产精品高清无码| 国产亚洲精品久久久| 日韩中文影院| 先锋影音亚洲资源| 美国三级日本三级久久99| 老熟女高潮一区二区三区| 亚洲女同一区二区| 国产偷拍一区二区| 欧美裸体xxxx极品少妇| 亚洲小说春色综合另类电影| 国产一二三区在线播放| 国产成人精品影视| 日本中文字幕免费观看| 欧美精品一区二区蜜臀亚洲| 高清在线视频不卡| 久久天堂国产精品| 视频一区视频二区中文| 亚洲区自拍偷拍| 欧美精品乱码久久久久久| 特黄视频在线观看| 91chinesevideo永久地址| 韩国一区二区三区视频| 国产女主播av| 99久久精品免费看| 伊人中文字幕在线观看| 在线免费看av不卡| 国产免费av国片精品草莓男男| 欧美日韩免费高清| 日韩成人精品在线| 99自拍视频在线| 日韩欧美国产1| 欧亚av在线| 亚洲亚洲精品三区日韩精品在线视频| aa级大片欧美三级| 四虎永久免费在线观看| 欧美日本国产视频| 青春草在线免费视频| 精品久久久久亚洲| 蜜臀91精品一区二区三区 | www.亚洲免费av| 麻豆精品久久久久久久99蜜桃| 亚洲成人三级在线| a欧美人片人妖| 中文字幕在线亚洲精品| 成人网男人的天堂| 超碰在线免费97| 亚洲最大中文字幕| 日韩免费一级| 欧美与动交zoz0z| 99久久99久久免费精品蜜臀| 亚洲视屏在线观看| 深夜福利日韩在线看| 这里视频有精品| 毛葺葺老太做受视频| 亚洲综合一区在线| h视频在线播放| 国产一区二区久久久| 久草在线在线精品观看| 欧美激情黑白配| 久久综合88中文色鬼| 亚洲黄页网站| 九热视频在线观看| 国产精品乱人伦| 熟妇人妻av无码一区二区三区 | 日韩亚洲国产免费|