婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于MySQL死鎖問題的深入分析

關于MySQL死鎖問題的深入分析

熱門標簽:走過哪個省地圖標注 銷售語音電話機器人 安徽ai電話電銷機器人有效果嗎 常州網絡外呼系統開發 外呼系統電銷受騙 在哪里申請400電話 400電話申請信用卡 巫師三血與酒地圖標注 萊西市地圖標注

前言

如果我們的業務處在一個非常初級的階段,并發程度比較低,那么我們可以幾年都遇不到一次死鎖問題的發生,反之,我們業務的并發程度非常高,那么時不時爆出的死鎖問題肯定讓我們非常撓頭。不過在死鎖問題發生時,很多沒有經驗的同學的第一反應就是成為一只鴕鳥:這玩意兒很高深,我也看不懂,聽天由命吧,又不是一直發生。其實如果大家認真研讀了我們之前寫的3篇關于MySQL中語句加鎖分析的文章,加上本篇關于死鎖日志的分析,那么解決死鎖問題應該也不是那么摸不著頭腦的事情了。

準備工作

為了故事的順利發展,我們需要建一個表:

CREATE TABLE hero (
 id INT,
 name VARCHAR(100),
 country varchar(100),
 PRIMARY KEY (id),
 KEY idx_name (name)
) Engine=InnoDB CHARSET=utf8;

我們為hero表的id列創建了聚簇索引,為name列創建了一個二級索引。這個hero表主要是為了存儲三國時的一些英雄,我們向表中插入一些記錄:

INSERT INTO hero VALUES
 (1, 'l劉備', '蜀'),
 (3, 'z諸葛亮', '蜀'),
 (8, 'c曹操', '魏'),
 (15, 'x荀彧', '魏'),
 (20, 's孫權', '吳');

現在表中的數據就是這樣的:

mysql> SELECT * FROM hero;
+----+------------+---------+
| id | name | country |
+----+------------+---------+
| 1 | l劉備 | 蜀 |
| 3 | z諸葛亮 | 蜀 |
| 8 | c曹操 | 魏 |
| 15 | x荀彧 | 魏 |
| 20 | s孫權 | 吳 |
+----+------------+---------+
5 rows in set (0.00 sec)

準備工作就做完了。

創建死鎖情景

我們先創建一個發生死鎖的情景,在Session A和Session B中分別執行兩個事務,具體情況如下:

我們分析一下:

  • 從第③步中可以看出,Session A中的事務先對hero表聚簇索引的id值為1的記錄加了一個X型正經記錄鎖。
  • 從第④步中可以看出,Session B中的事務對hero表聚簇索引的id值為3的記錄加了一個X型正經記錄鎖。
  • 從第⑤步中可以看出,Session A中的事務接著想對hero表聚簇索引的id值為3的記錄也加了一個X型正經記錄鎖,但是與第④步中Session B中的事務加的鎖沖突,所以Session A進入阻塞狀態,等待獲取鎖。
  • 從第⑥步中可以看出,Session B中的事務想對hero表聚簇索引的id值為1的記錄加了一個X型正經記錄鎖,但是與第③步中Session A中的事務加的鎖沖突,而此時Session A和Session B中的事務循環等待對方持有的鎖,死鎖發生,被MySQL服務器的死鎖檢測機制檢測到了,所以選擇了一個事務進行回滾,并向客戶端發送一條消息:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

以上是我們從語句加了什么鎖的角度出發來進行死鎖情況分析的,但是實際應用中我們可能壓根兒不知道到底是哪幾條語句產生了死鎖,我們需要根據MySQL在死鎖發生時產生的死鎖日志來逆向定位一下到底是什么語句產生了死鎖,從而再優化我們的業務。

查看死鎖日志

設計InnoDB的大叔給我們提供了SHOW ENGINE INNODB STATUS命令來查看關于InnoDB存儲引擎的一些狀態信息,其中就包括了系統最近一次發生死鎖時的加鎖情況。在上邊例子中的死鎖發生時,我們運行一下這個命令:

mysql> SHOW ENGINE INNODB STATUS\G
...省略了好多其他信息
------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-06-20 13:39:19 0x70000697e000
*** (1) TRANSACTION:
TRANSACTION 30477, ACTIVE 10 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s)
MySQL thread id 2, OS thread handle 123145412648960, query id 46 localhost 127.0.0.1 root statistics
select * from hero where id = 3 for update
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30477 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
 0: len 4; hex 80000003; asc  ;;
 1: len 6; hex 000000007517; asc  u ;;
 2: len 7; hex 80000001d0011d; asc  ;;
 3: len 10; hex 7ae8afb8e8919be4baae; asc z   ;;
 4: len 3; hex e89c80; asc ;;

*** (2) TRANSACTION:
TRANSACTION 30478, ACTIVE 8 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1160, 2 row lock(s)
MySQL thread id 3, OS thread handle 123145412927488, query id 47 localhost 127.0.0.1 root statistics
select * from hero where id = 1 for update
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30478 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
 0: len 4; hex 80000003; asc  ;;
 1: len 6; hex 000000007517; asc  u ;;
 2: len 7; hex 80000001d0011d; asc  ;;
 3: len 10; hex 7ae8afb8e8919be4baae; asc z   ;;
 4: len 3; hex e89c80; asc ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30478 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
 0: len 4; hex 80000001; asc  ;;
 1: len 6; hex 000000007517; asc  u ;;
 2: len 7; hex 80000001d00110; asc  ;;
 3: len 7; hex 6ce58898e5a487; asc l  ;;
 4: len 3; hex e89c80; asc ;;

*** WE ROLL BACK TRANSACTION (2)
------------
...省略了好多其他信息

我們只關心最近發生的死鎖信息,所以就把以LATEST DETECTED DEADLOCK這一部分給單獨提出來分析一下。下邊我們就逐行看一下這個輸出的死鎖日志都是什么意思:

首先看第一句:

2019-06-20 13:39:19 0x70000697e000

這句話的意思就是死鎖發生的時間是:2019-06-20 13:39:19,后邊的一串十六進制0x70000697e000表示的操作系統為當前session分配的線程的線程id。

然后是關于死鎖發生時第一個事務的有關信息:

*** (1) TRANSACTION:

# 為事務分配的id為30477,事務處于ACTIVE狀態已經10秒了,事務現在正在做的操作就是:“starting index read”
TRANSACTION 30477, ACTIVE 10 sec starting index read

# 此事務使用了1個表,為1個表上了鎖(此處不是說為該表加了表鎖,只要不是進行一致性讀的表,都需要加鎖,具體怎么加鎖請看加鎖語句分析或者小冊章節)
mysql tables in use 1, locked 1

# 此事務處于LOCK WAIT狀態,擁有3個鎖結構(2個行鎖結構,1個表級別X型意向鎖結構,鎖結構在小冊中重點介紹過),heap size是為了存儲鎖結構而申請的內存大小(我們可以忽略),其中有2個行鎖的結構
LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s)

# 本事務所在線程的id是2(MySQL自己命名的線程id),該線程在操作系統級別的id就是那一長串數字,當前查詢的id為46(MySQL內部使用,可以忽略),還有用戶名主機信息
MySQL thread id 2, OS thread handle 123145412648960, query id 46 localhost 127.0.0.1 root statistics

# 本事務發生阻塞的語句
select * from hero where id = 3 for update

# 本事務當前在等待獲取的鎖:
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

# 等待獲取的表空間ID為151,頁號為3,也就是表hero的PRIMAY索引中的某條記錄的鎖(n_bits是為了存儲本頁面的鎖信息而分配的一串內存空間,小冊中有詳細介紹),該鎖的類型是X型正經記錄鎖(rec but not gap)
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30477 lock_mode X locks rec but not gap waiting

# 該記錄在頁面中的heap_no為2,具體的記錄信息如下:
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

# 這是主鍵值
0: len 4; hex 80000003; asc  ;;

# 這是trx_id隱藏列
1: len 6; hex 000000007517; asc  u ;;

# 這是roll_pointer隱藏列
2: len 7; hex 80000001d0011d; asc  ;;

# 這是name列
3: len 10; hex 7ae8afb8e8919be4baae; asc z   ;;

# 這是country列
4: len 3; hex e89c80; asc ;;

從這個信息中可以看出,Session A中的事務為2條記錄生成了鎖結構,但是其中有一條記錄上的X型正經記錄鎖(rec but not gap)并沒有獲取到,沒有獲取到鎖的這條記錄的位置是:表空間ID為151,頁號為3,heap_no為2。當然,設計InnoDB的大叔還貼心的給出了這條記錄的詳細情況,它的主鍵值為80000003,這其實是InnoDB內部存儲使用的格式,其實就代表數字3,也就是該事務在等待獲取hero表聚簇索引主鍵值為3的那條記錄的X型正經記錄鎖。

然后是關于死鎖發生時第二個事務的有關信息:

其中的大部分信息我們都已經介紹過了,我們就挑重要的說:

*** (2) TRANSACTION:
TRANSACTION 30478, ACTIVE 8 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1160, 2 row lock(s)
MySQL thread id 3, OS thread handle 123145412927488, query id 47 localhost 127.0.0.1 root statistics
select * from hero where id = 1 for update

# 表示該事務獲取到的鎖信息
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30478 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

# 主鍵值為3
0: len 4; hex 80000003; asc  ;;
1: len 6; hex 000000007517; asc  u ;;
2: len 7; hex 80000001d0011d; asc  ;;
3: len 10; hex 7ae8afb8e8919be4baae; asc z   ;;
4: len 3; hex e89c80; asc ;;

# 表示該事務等待獲取的鎖信息
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 171 page no 3 n bits 72 index PRIMARY of table `dahaizi`.`hero` trx id 30478 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

# 主鍵值為1
0: len 4; hex 80000001; asc  ;;
1: len 6; hex 000000007517; asc  u ;;
2: len 7; hex 80000001d00110; asc  ;;
3: len 7; hex 6ce58898e5a487; asc l  ;;
4: len 3; hex e89c80; asc ;;

從上邊的輸出可以看出來,Session B中的事務獲取了hero表聚簇索引主鍵值為3的記錄的X型正經記錄鎖,等待獲取hero表聚簇索引主鍵值為1的記錄的X型正經記錄鎖(隱含的意思就是這個hero表聚簇索引主鍵值為1的記錄的X型正經記錄鎖已經被SESSION A中的事務獲取到了)。

看最后一部分:

*** WE ROLL BACK TRANSACTION (2)

最終InnoDB存儲引擎決定回滾第2個事務,也就是Session B中的那個事務。

死鎖分析的思路

1、查看死鎖日志時,首先看一下發生死鎖的事務等待獲取鎖的語句都是啥。

本例中,發現SESSION A發生阻塞的語句是:

select * from hero where id = 3 for update

SESSION B發生阻塞的語句是:

select * from hero where id = 1 for update

然后切記:到自己的業務代碼中找出這兩條語句所在事務的其他語句。

2、找到發生死鎖的事務中所有的語句之后,對照著事務獲取到的鎖和正在等待的鎖的信息來分析死鎖發生過程。

從死鎖日志中可以看出來,SESSION A獲取了hero表聚簇索引id值為1的記錄的X型正經記錄鎖(這其實是從SESSION B正在等待的鎖中獲取的),查看SESSION A中的語句,發現是下邊這個語句造成的(對照著語句加鎖分析那三篇文章):

select * from hero where id = 1 for update;

還有SESSION B獲取了hero表聚簇索引id值為3的記錄的X型正經記錄鎖,查看SESSION B中的語句,發現是下邊這個語句造成的(對照著語句加鎖分析那三篇文章):

select * from hero where id = 3 for update;

然后看SESSION A正在等待hero表聚簇索引id值為3的記錄的X型正經記錄鎖,這個是由于下邊這個語句造成的:

select * from hero where id = 3 for update;

然后看SESSION B正在等待hero表聚簇索引id值為1的記錄的X型正經記錄鎖,這個是由于下邊這個語句造成的:

select * from hero where id = 1 for update;

然后整個死鎖形成過程就根據死鎖日志給還原出來了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Mysql查看死鎖與解除死鎖的深入講解
  • MySQL死鎖檢查處理的正常方法
  • MySQL死鎖的產生原因以及解決方案
  • MySQL死鎖套路之唯一索引下批量插入順序不一致
  • 一個mysql死鎖場景實例分析
  • 一次神奇的MySQL死鎖排查記錄
  • MySQL數據庫之Purge死鎖問題解析
  • 詳解通過SQL進行分布式死鎖的檢測與消除

標簽:煙臺 鞍山 河北 赤峰 果洛 陽江 來賓 黃石

巨人網絡通訊聲明:本文標題《關于MySQL死鎖問題的深入分析》,本文關鍵詞  關于,MySQL,死鎖,問,題的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于MySQL死鎖問題的深入分析》相關的同類信息!
  • 本頁收集關于關于MySQL死鎖問題的深入分析的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久久毛片av大全日韩| 欧美日韩一区高清| 国产精品一区二区男女羞羞无遮挡| 国产日韩欧美在线一区| 1区2区3区欧美| 精品国产伦一区二区三区免费| 欧美片在线播放| 在线视频一区二区免费| 99在线精品一区二区三区| 美国十次了思思久久精品导航| 欧美成人欧美edvon| 国产精品免费看片| 国产精品资源站在线| 麻豆精品国产传媒mv男同| 亚洲第一福利一区| 亚洲综合一二区| 久久精品72免费观看| 亚洲午夜精品17c| 日本大胆欧美人术艺术动态| 91精品视频网| 国产欧美精品在线观看| 久久99国产精品久久99果冻传媒| av不卡在线播放| 欧美刺激午夜性久久久久久久| 久久久.com| 亚洲品质自拍视频| 日韩一级二级三级| 国产精品毛片久久久久久久| 久久精品99久久久| 欧洲精品中文字幕| 26uuu亚洲| 国产喂奶挤奶一区二区三区| 国产日本欧美一区二区| 国产最新精品精品你懂的| 成人一区二区三区| 日韩精品一区二区三区中文精品| 国产精品国产三级国产普通话99| 自拍av一区二区三区| 成人avav在线| 欧美日韩成人激情| 精品欧美乱码久久久久久1区2区| 亚洲国产另类精品专区| 韩国一区二区三区| 日韩三级在线观看| 精品国免费一区二区三区| 99精品在线观看视频| 一区二区三区日韩在线观看| 亚洲一区在线观看免费| 91麻豆免费看片| 国产婷婷精品av在线| 久久综合色综合88| 国产一区欧美一区| 久久久青草青青国产亚洲免观| 国产精品污污网站在线观看| 国模大尺度一区二区三区| 欧美国产乱子伦| 首页亚洲欧美制服丝腿| 欧美一级国产精品| 国产一区日韩二区欧美三区| 中文字幕成人网| 国产色一区二区| 成人aaaa免费全部观看| 欧美激情中文字幕一区二区| 欧美精品一二三区| 亚洲欧美一区二区在线观看| 色综合久久中文综合久久牛| 日韩精品欧美精品| 91国偷自产一区二区开放时间 | 欧美在线观看你懂的| 亚洲综合区在线| 1区2区3区欧美| 日韩一区二区三区在线| 午夜久久电影网| 亚洲精品乱码久久久久久| 亚洲精品在线观| 国产在线一区二区综合免费视频| 免费观看久久久4p| 日韩久久免费av| 日本麻豆一区二区三区视频| 亚洲特黄一级片| 亚洲国产精品成人综合色在线婷婷 | 香蕉影视欧美成人| 久久久久国产精品厨房| xf在线a精品一区二区视频网站| 91麻豆精品在线观看| 蜜臀精品一区二区三区在线观看| 欧美久久久久久蜜桃| 精品一区免费av| 成人性生交大合| 成人h动漫精品一区二区| 不卡在线观看av| 麻豆精品精品国产自在97香蕉| 视频一区国产视频| 亚洲国产精品久久久久婷婷884| 天天综合色天天| 久久久国产午夜精品| 国产亚洲精品aa| 日韩理论在线观看| 偷拍日韩校园综合在线| 国产综合久久久久久久久久久久| 国产精品乱码一区二区三区软件| 日本一区二区三区在线不卡| 日韩一区二区在线观看视频播放| 久久久久国产成人精品亚洲午夜| 国产精品美女久久久久久久 | 国产精品美女久久久久高潮| 国产呦萝稀缺另类资源| 亚洲一二三区不卡| 亚洲三级久久久| 不卡视频一二三四| 欧美日韩国产色站一区二区三区| 国产精品夜夜爽| 国产成人亚洲综合a∨猫咪| 精品噜噜噜噜久久久久久久久试看| 久久蜜桃香蕉精品一区二区三区| 4438x亚洲最大成人网| 日韩高清在线观看| 欧美一区日韩一区| 精品一区二区三区的国产在线播放 | 国产色产综合产在线视频| 日本最新不卡在线| 欧美日本在线播放| 国产综合色视频| 色哦色哦哦色天天综合| 久久久精品国产99久久精品芒果| 亚洲日本va在线观看| 国产99精品国产| 午夜精品成人在线视频| 欧美一区永久视频免费观看| 蜜桃av一区二区在线观看 | 国产91富婆露脸刺激对白| 亚洲天堂中文字幕| 91麻豆精品国产91久久久久久 | 日韩一区二区三区四区| 婷婷丁香久久五月婷婷| 色综合婷婷久久| 精品一区二区免费视频| 亚洲女人的天堂| 久久综合九色综合欧美就去吻 | 日本欧美韩国一区三区| 国产精品青草综合久久久久99| 欧美色老头old∨ideo| 日韩伦理电影网| 日韩欧美国产一区在线观看| 极品少妇一区二区三区精品视频 | 日韩视频免费观看高清完整版| 国产激情精品久久久第一区二区 | 亚洲电影你懂得| 欧美高清视频一二三区 | 亚洲第一成年网| 亚洲.国产.中文慕字在线| 一区二区三区不卡视频在线观看| 久久久久久久av麻豆果冻| 精品久久一区二区三区| 久久精品亚洲精品国产欧美| 盗摄精品av一区二区三区| 色综合久久久久| 不卡的av在线| 欧美在线免费观看亚洲| 久久精品在这里| 亚洲一区二区视频在线观看| 日本午夜一区二区| 国产精品一区在线观看乱码| 色婷婷亚洲精品| 国产精品99久久久久| 日日夜夜免费精品| 在线视频一区二区三区| 久久久国产精品麻豆| 欧美aⅴ一区二区三区视频| 国产mv日韩mv欧美| 色老综合老女人久久久| 中文字幕欧美激情| 国产美女视频91| 国产suv精品一区二区6| 在线观看亚洲a| 欧美精品vⅰdeose4hd| 国产人成一区二区三区影院| 日韩精品一区二区三区中文精品| 欧美午夜理伦三级在线观看| 欧美日韩三级在线| 一区二区三区中文免费| 久久99蜜桃精品| 蜜桃av一区二区在线观看| 欧美一区二区三区播放老司机| 色婷婷av一区二区三区大白胸| 26uuu国产在线精品一区二区| 国产精品2024| 精品成人a区在线观看| 国产精品国产精品国产专区不蜜| 美女网站视频久久| 99久久99久久综合| 国产午夜精品久久| 国精产品一区一区三区mba视频 | 国产精品一级在线| 欧美一区二区三区在线看| 欧美三级电影网站| 国产成人一区在线| 青青草国产精品亚洲专区无| 99精品视频在线观看| 丝袜诱惑亚洲看片|