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

兩個小工具,MySQL死鎖分析,新技能又Get!

開發(fā) 開發(fā)工具 MySQL
數(shù)據(jù)庫死鎖,是最難調(diào)試與追蹤的。可以通過什么工具模擬并發(fā)事務(wù),查看信息,解決問題呢?這是今天要分享的內(nèi)容。

數(shù)據(jù)庫死鎖,是最難調(diào)試與追蹤的。

場景如下:

數(shù)據(jù)庫死鎖

同一個表,事務(wù)內(nèi)先插入一條記錄,再更新這條記錄,并發(fā)時會死鎖。

數(shù)據(jù)庫死鎖

并且能夠復(fù)現(xiàn)。

可以通過什么工具模擬并發(fā)事務(wù),查看信息,解決問題呢?這是今天要分享的內(nèi)容。

一、前置準(zhǔn)備

  1. set session transaction isolation level repeatable read; 
  2. set session autocommit=0
  3.   
  4. create table t ( 
  5. id int(20) primary key AUTO_INCREMENT, 
  6. cell varchar(20) unique 
  7. )engine=innodb
  8.   
  9. start transaction; 
  10. insert into t(cell) values(11111111111); 
  11. insert into t(cell) values(22222222222); 
  12. insert into t(cell) values(33333333333); 
  13. commit; 

說明:

  • 案發(fā)時,事務(wù)隔離級別RR;
  • 多終端實驗,需要關(guān)閉事務(wù)自動提交;
  • 建表,設(shè)置PK與unique,初始化數(shù)據(jù);

二、并發(fā)事務(wù)模擬

  1. Session A: 
  2. start transaction; 
  3. insert into t(cell)values(44444444444);  [1] 
  4.         Session B: 
  5.         start transaction; 
  6.         insert into t(cell) values(55555555555); [2] 
  7. update t set cell=123 where cell=44444444444; [3]    
  8.         update t set cell=456 where cell=55555555555; [4] 

開啟兩個終端模擬并發(fā)事務(wù):

  • 紅色SQL為事務(wù)A;
  • 黑色SQL為事務(wù)B;
  • [1][2][3][4]為執(zhí)行時序;

三、實驗現(xiàn)象

  1. insert into t(cell)values(44444444444);  [1] 

事務(wù)A插入數(shù)據(jù),***執(zhí)行

結(jié)果:插入成功

  1. insert into t(cell) values(55555555555); [2] 

事務(wù)B插入數(shù)據(jù),第二執(zhí)行

結(jié)果:插入成果

  1. update t set cell=123 where cell=44444444444; [3] 

事務(wù)A修改[1]中插入的數(shù)據(jù),第三執(zhí)行

結(jié)果:阻塞,等待執(zhí)行結(jié)果

畫外音:修改一條自己插入的數(shù)據(jù),在等待什么呢?

  1. update t set cell=456 where cell=55555555555; [4] 

事務(wù)B修改[2]中插入的數(shù)據(jù),***執(zhí)行

結(jié)果:

  • 事務(wù)B死鎖,事務(wù)B被回滾;
  • 事務(wù)A中,[3]語句阻塞結(jié)束,執(zhí)行成功;

 

畫外音:說明事務(wù)A中阻塞的語句,確實在等事務(wù)B中的某個鎖。

四、結(jié)果分析

兩個事務(wù),各自修改自己插入的數(shù)據(jù),卻產(chǎn)生了死鎖,確實詭異。

上述實驗現(xiàn)象的兩個核心問題是:

  • 語句[3]阻塞,在等待什么鎖?
  • 語句[4]死鎖,此時事務(wù)A和事務(wù)B一定是彼此占住一把鎖,請求彼此的鎖,這些鎖又是什么呢?

工具一:

  1. show engine innodb status; 

執(zhí)行之后,顯示的內(nèi)容如下(放大仔細(xì)看):

信息很多,別急,樓主娓娓道來。

***部分,關(guān)鍵詞是:

  • Transaction 1,事務(wù)3998;
  • 在執(zhí)行
    1. update t set cell=123 where cell=44444444444
  • 正在等待鎖釋放(waiting for this lock to be granted),記錄鎖(record locks),主鍵索引上(index primary),互斥鎖(lock_mode X),物理記錄(physical record),asc 55555555555;

畫外音:英文比較差沒事,抓關(guān)鍵詞。

畫外音,InnoDB存儲引擎,聚集索引與非聚集索引的實現(xiàn)方式,決定了鎖會加在聚集索引上,詳見文章:

1分鐘了解MyISAM與InnoDB的索引差異》。

第二部分,關(guān)鍵詞是:

  • Transaction 2,事務(wù)3999;
  • 正在執(zhí)行
    1. update t set cell=456 where cell=55555555555
  • 持有鎖(holds the lock),記錄鎖(record locks),主鍵索引上(index primary),互斥鎖(lock_mode X),物理記錄(physical record),asc 55555555555;
  • 正在等待鎖釋放(waiting for this lock to be granted),記錄鎖(record locks),主鍵索引上(index primary),互斥鎖(lock_mode X),物理記錄(physical record),asc 11111111111;
  • 事務(wù)2回滾(we roll back transaction 2);

通過show engine innodb status; 能夠看到很多事務(wù)與鎖之間的信息,對分析問題十分有幫助,這些信息,能夠解釋一些問題,但仍有兩個疑惑:

(1)事務(wù)1為啥想拿55555555555的鎖?

畫外音:這正是,事務(wù)1被阻塞的原因。

(2)事務(wù)2為啥想拿11111111111的鎖?死鎖的發(fā)生,說明事務(wù)1此時真占著11111111111的鎖,這又是為什么呢?

畫外音:***個事務(wù)占111搶555,第二個事務(wù)占555搶111,循環(huán)嵌套,才會死鎖。

工具二:

  1. explain 

為了進(jìn)一步尋找原因,可以通過explain看下導(dǎo)致死鎖語句的執(zhí)行計劃。

  1. explain update t set cell=456 where cell=55555555555

(1) select_type:SIMPLE

這是一個簡單類型的SQL語句,不含子查詢或者UNION。

(2) type:index

訪問類型,即找到所需數(shù)據(jù)使用的遍歷方式,潛在的方式有:

  • ALL(Full Table Scan):全表掃描;
  • index:走索引的全表掃描;
  • range:***where子句的范圍索引掃描;
  • ref/eq_ref:非唯一索引/唯一索引單值掃描;
  • const/system:常量掃描;
  • NULL:不用訪問表;

上述掃描方式,ALL最慢,逐步變快,NULL最快。

懷疑點1:明明cell字段有uniq索引,為何要進(jìn)行走PK索引的全表掃描呢?

(3) possible_keys:NULL

可能在哪個索引找到記錄。

(4) key:PRIMARY

實際使用索引。

畫外音:使用PK進(jìn)行的全表掃描。

(5) ref:NULL

哪些列,或者常量用于查找索引上的值。

懷疑點2:where條件中的查詢條件55555555555,本來應(yīng)該作為在索引上被檢索的值呀?

(6) rows:5

找到所需記錄,預(yù)估需要讀取的行數(shù)。

懷疑點3:明明修改的是5,為何初始化的1,2,3,以及***個事務(wù)插入的4,以及第二個事務(wù)插入的5,都要被讀取呢?不應(yīng)該全表掃描呀。

通過explain,基本已經(jīng)可以判斷:

  1. update t set cell=456 where cell=55555555555

并沒有和我們預(yù)想一樣,走cell索引進(jìn)行查詢,而是走了PK索引進(jìn)行了全表掃描。

再仔細(xì)一看:

  1. create table t ( 
  2. id int(20) primary key AUTO_INCREMENT, 
  3. cell varchar(20) unique 
  4. )engine=innodb

建表的時候cell定義的是字符串類型。

而更新的時候,

  1. update t set cell=456 where cell=55555555555

使用的是整數(shù)類型。

類型轉(zhuǎn)換,會導(dǎo)致全表掃描,出現(xiàn)鎖升級,鎖住全部記錄。

加上引號,再次通過explain驗證一下:

  1. explain update t set cell'456 ' where cell'55555555555 '

果然印證了猜想:

  • type:range,變?yōu)榱俗咚饕淖址葘Γ秶鷴呙?
  • possible_keys:cell,通過cell索引找到了記錄;
  • key:cell,實際使用cell索引;
  • ref:const,使用了常量' 555'進(jìn)行比對;
  • rows:1,預(yù)估讀取行數(shù)是1;

這下全部可以解釋了。

總結(jié)

就本例而言:需要注意字符串與整數(shù)之間的強制類型轉(zhuǎn)換,有時候少一個引號,就會使得行鎖升級為表鎖。

死鎖是MySQL中非常難調(diào)試的問題,常見的思路與方法有:

  • 通過多終端模擬并發(fā)事務(wù),復(fù)現(xiàn)死鎖;
  • 通過show engine innodb status; 可以查看事務(wù)與鎖的信息;
  • 通過explain可以查看執(zhí)行計劃;

思路比結(jié)論更重要,希望大家有收獲。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2021-07-08 22:55:39

Python單詞統(tǒng)計

2021-07-09 09:31:04

getPython代碼

2022-12-28 12:29:45

duf命令

2017-07-25 14:20:13

戴爾配置功耗

2013-03-29 14:46:33

App開發(fā)小工具輔助工具

2009-11-19 08:48:10

Windows 7桌面工具

2018-09-22 20:33:56

斑馬平臺

2019-09-10 15:18:44

云計算

2021-05-10 11:06:31

Python工具代碼

2020-11-26 12:05:44

Python小工具代碼

2021-05-20 11:30:17

Python工具代碼

2021-09-21 09:03:48

微信工具技巧

2010-07-01 10:24:30

UML小工具

2009-12-08 14:02:25

Windows 7小工

2022-03-30 15:11:26

Python房價工具

2011-03-10 09:03:35

Python

2012-01-18 11:02:37

Tomcat

2022-05-16 09:20:00

開發(fā)工具

2014-05-04 14:14:53

云計算公有云

2019-12-03 10:19:34

開發(fā)者技能工具
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精产嫩模国品一二三区 | 久久福利电影 | 亚洲欧美视频一区 | www.色.com | 欧美一级大黄 | 久久精品亚洲国产奇米99 | 99re热精品视频国产免费 | 欧美 日韩 国产 成人 | 熟女毛片 | 成人精品国产一区二区4080 | 紧缚调教一区二区三区视频 | 日日夜夜天天干 | av在线一区二区三区 | 成人在线视频免费观看 | 最近中文字幕第一页 | 国产精品99久久久久久人 | 国产一区2区 | 中文字幕视频在线观看 | 成人一区二区三区在线 | 成年视频在线观看 | av在线免费观看网站 | 午夜午夜精品一区二区三区文 | 免费黄色片视频 | 国产免费一级片 | 国产美女久久 | 在线āv视频 | 综合一区二区三区 | 亚洲一区二区在线播放 | 日韩av第一页| 亚洲91精品| 久久国产精品99久久久大便 | 国产精品久久久久久久久久 | 国产精品欧美大片 | 91精品国产综合久久久久久丝袜 | 亚洲人va欧美va人人爽 | 成在线人视频免费视频 | 特级特黄特色的免费大片 | 一区二区三区精品视频 | 欧美精品一区二区三区在线播放 | 精品乱子伦一区二区三区 | 国产精品亚洲二区 |