精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

色窝窝无码一区二区三区| 精品国产av色一区二区深夜久久| 国产精品一区在线看| 免费一级片91| 久久天天躁狠狠躁老女人| 一级黄色免费毛片| а_天堂中文在线| 久久综合久久鬼色中文字| 国产精品视频自拍| 久久亚洲AV无码| 成人在线亚洲| 亚洲国产精品久久91精品| 色七七在线观看| 欧美bbbxxxxx| 国产精品午夜在线| 国产一区国产精品| 一级aaaa毛片| 久久久精品网| 欧美高清性猛交| 亚洲天堂最新地址| 男人的天堂久久| 在线观看h网| 男人天堂欧美日韩| 久久99亚洲热视| 亚洲色图日韩精品| 无码日韩精品一区二区免费| 91麻豆精品91久久久久同性| 久久网站免费视频| 羞羞污视频在线观看| 日本一区二区动态图| 国产伦精品一区二区三区视频黑人 | www.天天射.com| 黄视频网站在线观看| 自拍偷拍欧美精品| 日韩精品久久久| 亚洲人午夜射精精品日韩| 国产一区二三区好的| 国产激情久久久久| 日韩女优在线观看| 中文字幕日韩一区二区不卡| 这里只有视频精品| 精品国产无码在线观看| 欧美黑人巨大videos精品| 日韩三级精品电影久久久| 亚洲第一天堂久久| 精品乱码一区二区三区四区| 在线免费观看不卡av| wwwxxx黄色片| 欧美成人h版| 欧美视频在线观看 亚洲欧| 熟女少妇在线视频播放| av剧情在线观看| 亚洲va国产天堂va久久en| 丰满人妻一区二区三区53号| 成人免费网址| 亚洲欧洲中文日韩久久av乱码| 亚洲日本韩国一区| 日韩69视频在线观看| 日韩精品一区二区三区国语自制| 欧美女激情福利| 免费99精品国产自在在线| 波多野结衣喷潮| 小小影院久久| 另类美女黄大片| 免费中文字幕视频| 狠狠综合久久av一区二区老牛| 九九久久久久久久久激情| 青草草在线视频| 亚洲天堂男人| 2019中文字幕在线| 免费的毛片视频| 青青草97国产精品免费观看 | 久久久成人精品视频| 国产精品视频一区二区三| 欧美国内亚洲| 国语自产偷拍精品视频偷 | japanese中文字幕| 久久人体视频| 欧美大成色www永久网站婷| 免费一级片在线观看| 一区二区三区高清视频在线观看| 欧美最猛性xxxxx免费| 最近中文字幕在线免费观看| 国内一区二区视频| 国产亚洲情侣一区二区无| 欧美视频综合| 亚洲天堂成人网| 成人免费性视频| 在线毛片观看| 欧美高清一级片在线| caopor在线| 精品一区毛片| 美女精品视频一区| 亚洲GV成人无码久久精品| 日本视频在线免费| 动漫av一区| 在线观看国产精品91| 疯狂试爱三2浴室激情视频| 激情久久久久久| 国产精品日韩电影| 三级在线观看网站| 中文欧美字幕免费| 亚洲色成人www永久在线观看| 午夜日韩成人影院| 精品久久久久av影院 | 国产99久久久国产精品成人免费 | 噜噜爱69成人精品| 91aaaa| 国产高清一级毛片在线不卡| 亚洲欧美二区三区| 免费观看精品视频| 在线精品自拍| 久久精品国产一区二区三区| 全部毛片永久免费看| 精品一区二区日韩| 秋霞毛片久久久久久久久| 91三级在线| 欧美视频第二页| 中文人妻一区二区三区| 亚洲成人最新网站| 99久久精品国产导航| 国产精品极品美女在线观看免费| 国产jzjzjz丝袜老师水多| 久久久国产一区二区三区四区小说 | 国产精品久久久久久久av电影| 精品国产免费无码久久久| 国产日韩欧美一区二区三区综合| 精品国产av无码一区二区三区| 色999久久久精品人人澡69 | 久久久久亚洲av无码a片| 精品成人在线| 亚洲一区二区中文字幕| 91免费在线| 一本大道久久a久久精品综合| 91九色蝌蚪porny| 你懂的亚洲视频| 国产精品视频白浆免费视频| 免费毛片在线| 一本一道综合狠狠老| 欧美熟妇精品一区二区蜜桃视频| 国产真人做爰视频免费| 天天做天天爱天天综合网2021 | 日韩五码电影| 在线观看国产精品淫| 无码人妻熟妇av又粗又大| 91在线国内视频| 三上悠亚久久精品| 红杏视频成人| 久久久免费av| 色婷婷av一区二区三区之红樱桃 | 久久久国产一区二区三区四区小说 | 欧美在线激情| 欧美电影免费观看高清完整| 精品香蕉一区二区三区| 欧美一二三区视频| 91亚洲资源网| 成人黄色一区二区| 欧美日韩大片免费观看| 久久理论片午夜琪琪电影网| 精品人妻少妇AV无码专区| 亚洲精品国产高清久久伦理二区| 国产91在线免费观看| 欧美视频一区| 极品日韩久久| 青青青手机在线视频| 中文日产幕无线码一区二区| 亚洲精品电影久久久| www.日本精品| 国产亚洲一二三区| 男女男精品视频站| 99九九热只有国产精品| 91黄在线观看| 蜜桃av在线播放| 亚洲奶大毛多的老太婆| 亚洲手机在线观看| 亚洲精品你懂的| 潘金莲一级淫片aaaaa| 在线成人黄色| 日韩中文一区二区三区| 亚洲欧美在线人成swag| 久久久亚洲国产天美传媒修理工| 网站黄在线观看| 在线观看三级视频欧美| 污污的视频在线免费观看| 国产成人精品亚洲777人妖| 免费在线观看亚洲视频| 色男人天堂综合再现| 99热99热| 在线观看涩涩| 久久亚洲精品一区二区| 少妇人妻一区二区| 欧美性淫爽ww久久久久无| 国产欧美日韩视频| 免费看污视频的网站| 亚洲啪啪综合av一区二区三区| 50一60岁老妇女毛片| 美女国产一区二区| 国产日本在线播放| 日韩久久视频| 精品999在线观看| 96视频在线观看欧美| 8050国产精品久久久久久| 在线国产91| 亚洲精品大尺度| 国产日韩精品suv| 一本久久综合亚洲鲁鲁五月天| 亚洲综合网在线| 久久无码av三级| 动漫av在线免费观看| 蜜臀久久99精品久久久画质超高清| 成人污网站在线观看| 欧美精品一二| 精品久久精品久久| 免费看一区二区三区| 国产精品久久久久久久久久久不卡 | 成人毛片一区二区| 亚洲综合专区| 亚洲精品日韩精品| 欧美禁忌电影网| 九色91在线视频| 亚洲性视频在线| 国产女人精品视频| 美女爆乳18禁www久久久久久| 国色天香久久精品国产一区| 日本午夜人人精品| 国产美女情趣调教h一区二区| 中文字幕日本欧美| 欧洲毛片在线| 日韩高清有码在线| 免费观看黄色一级视频| 制服丝袜在线91| 亚洲自拍偷拍另类| 日本道免费精品一区二区三区| 精品小视频在线观看| 亚洲精品久久7777| 欧美肥妇bbwbbw| 国产精品伦一区| av永久免费观看| 久久久午夜精品理论片中文字幕| 国产激情第一页| av在线不卡免费看| 欧美日韩一区二区三区四区五区六区| 国产一区二区三区四| 一起操在线视频| 久久精品免费看| 九九精品久久久| 久草在线在线精品观看| 一区二区三区 日韩| 美国欧美日韩国产在线播放| 91人人澡人人爽人人精品| 日本中文字幕不卡| 黄色aaa级片| 精品一二线国产| 91网址在线观看精品| 国产一区二区三区视频在线播放| 日本高清免费在线视频| 国产在线一区观看| av地址在线观看| 成人免费毛片app| 国产精品久久久久久亚洲色| 成人av网站在线观看免费| 高清中文字幕mv的电影| 不卡的av在线| 久久精品一区二区免费播放| 久久久91精品国产一区二区三区| 国产精品毛片一区二区| 欧美经典一区二区三区| 五月天免费网站| 最新成人av在线| 国产乱国产乱老熟300| 亚洲一区二区中文在线| 日本特黄一级片| 疯狂做受xxxx高潮欧美日本| youjizz在线视频| 精品视频资源站| 精品区在线观看| 亚洲精品aⅴ中文字幕乱码| 青青草观看免费视频在线| 夜夜嗨av一区二区三区免费区| 日本高清视频在线播放| 欧美日韩国产999| xxxxxx欧美| 成人免费视频网| 精品久久对白| 亚洲精品美女久久7777777| 一级毛片免费高清中文字幕久久网| 亚洲免费观看高清在线观看| 中文av字幕在线观看| 国产ts人妖一区二区| 一级性生活大片| 亚洲婷婷综合色高清在线| 日韩欧美一级视频| 欧美日韩免费视频| 黄色一级大片在线免费看国产一 | 97视频热人人精品| 亚洲大片精品免费| 在线播放 亚洲| 翔田千里一区二区| 日韩不卡的av| 久久色中文字幕| 欧美日韩精品在线观看视频| 一本大道av一区二区在线播放| 国产aⅴ爽av久久久久成人| 亚洲精品日韩欧美| 中文在线观看免费| 国产91免费看片| 波多野结衣欧美| 一区二区三视频| 久久婷婷亚洲| 中文字幕在线永久| 亚洲精品免费在线播放| 狠狠狠狠狠狠狠| 日韩电影中文字幕一区| 午夜伦理在线视频| 国产九九精品视频| 欧美大胆视频| 久久久久久久久久久综合| 日韩精品一二三区| 噜噜噜在线视频| 一区二区成人在线| 国产青青草视频| 中文字幕欧美精品日韩中文字幕| av今日在线| 国产精品久久7| 欧美日本在线| 亚洲综合伊人久久| 国产精品久久久久久福利一牛影视 | 超碰国产在线| 日本人成精品视频在线| 久久大胆人体视频| 日本黄色片一级片| 国产一区二区久久| 伊人久久久久久久久久久久久久| 91成人网在线| 国产在线电影| 日韩免费在线播放| 亚洲伊人春色| 国产女女做受ⅹxx高潮| k8久久久一区二区三区| 清纯粉嫩极品夜夜嗨av| 日韩一区二区三区视频在线| 免费大片在线观看www| 国产欧美一区二区三区久久| 精品国产欧美日韩| 日韩在线第三页| 亚洲国产精品成人综合色在线婷婷| 中文字幕国产在线观看| 日韩禁在线播放| sis001亚洲原创区| 国模精品一区二区三区| 伊人久久婷婷| xxxx黄色片| 黑人巨大精品欧美一区二区三区| 秋霞av鲁丝片一区二区| 97香蕉超级碰碰久久免费软件| 亚洲精品一区二区三区在线| av动漫在线播放| 成人精品电影在线观看| 国产精品久久久久久99| 精品视频久久久久久久| 成人免费看视频网站| 亚洲精品日韩精品| 国产一区在线观看视频| 久草成人在线视频| 欧美精品一区二区三区在线播放| 成年人黄色大片在线| 久久免费视频1| 日韩高清电影一区| 永久av免费网站| 日韩欧美你懂的| 九色porny丨首页入口在线| 欧美精品一区在线发布| 日韩电影在线免费看| 免费成人深夜夜行网站| 日韩午夜激情电影| 嗯~啊~轻一点视频日本在线观看| 精品乱子伦一区二区三区| 久久天堂成人| 波多野结衣爱爱视频| 日韩av综合网| 久久精品超碰| 草草视频在线免费观看| 国产片一区二区| 99精品视频免费看| 91av在线影院| 欧美大片aaaa| 欧产日产国产精品98| 91九色最新地址| 影音先锋中文在线视频| 久久资源av| 韩国理伦片一区二区三区在线播放 | 成人小说亚洲一区二区三区| 日本欧美一级片| 午夜精品久久99蜜桃的功能介绍| 30一40一50老女人毛片| 欧美一区二区大片| 欧美性猛交xxx高清大费中文| 国产三级中文字幕| 久久高清免费| 欧美一区在线直播|