日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 查看锁_SQL-mysql锁等待与死锁

發(fā)布時間:2023/12/10 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 查看锁_SQL-mysql锁等待与死锁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 前言

本篇是MYSQL高級進(jìn)階篇內(nèi)容第二篇,學(xué)習(xí)本篇的基礎(chǔ)是知識追尋者之前發(fā)布過的文章,尤其是《MYSQL架構(gòu)入門篇》重中之重;

《SQL-你真的了解什么SQL么?》

《SQL-小白最佳入門sql查詢一》

《SQL-小白最佳入門sql查詢二》

《SQL- 多年開發(fā)人員都不懂的插入與更新刪除操作注意點》

《SQL-SQL事物操作》

《SQL-Mysql數(shù)據(jù)類型》

《SQL-mysql視圖的前世今生》

《SQL-mysql儲存過程》

《SQL-mysql游標(biāo)與觸發(fā)器》

《SQL-mysql用戶權(quán)限管理》

《SQL-mysql架構(gòu)入門》

公眾號:知識追尋者

知識追尋者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 鎖等待

鎖等待的意思非常好理解,就是session (事物會話,開啟一個事物代表一個會話)A 對 某行數(shù)據(jù)獲取獨占鎖(在這邊一般就是寫鎖),然后session B 對相同的行進(jìn)行獲取獨占鎖就發(fā)生了鎖等待;簡單理解就是 小孩子搶玩具,誰先搶到 誰 先玩,沒搶到的玩具的孩子只能 等待 搶到玩具孩子玩膩了再給你,瞬間淚奔有木有,就是這么殘酷,當(dāng)然MYSQL 沒 這么殘忍 其 還是有一個保留參數(shù) innodb_lock_wait_timeout 指定死鎖 的時間,如果超過 死鎖等待時間就是報異常;

知識追尋者 做個實驗:

session A 執(zhí)行如下語句,開啟事物,更新索引為1 的語句;此時 session A 獲取了 id= 1 這條 語句的 寫鎖權(quán)限;

BEGIN; update `order` set `year`= '2022' where id = '1';

session B 執(zhí)行如下 語句 , 跟 上面的語句一樣 ,由于 id =1 這條數(shù)據(jù)的寫鎖已經(jīng)被session A 獲取,故會發(fā)生鎖等待的情況;

BEGIN; update `order` set `year`= '2022' where id = '1';

知識追尋者這邊默認(rèn)等待了50秒 就報了如下異常

Lock wait timeout exceeded; try restarting transaction

查看 默認(rèn)鎖等待 語句

show VARIABLES like 'innodb_lock_wait_timeout'

三 死鎖

3.1 死鎖的產(chǎn)生

死鎖 就是 兩個以上的會話 在 搶占 資源過程中 ,產(chǎn)生相互等待的情況;有點繞是不是,其實很簡單 死鎖是建立在 鎖等待的基礎(chǔ)上,session A 獲取 id = 1 的寫鎖 , session B 獲取 id =2 的寫鎖 ,此時由于索引不同,故不會長生鎖等待現(xiàn)象 ; 當(dāng) session A 嘗試 獲取 id =2 的 寫鎖時 ,由于 id = 2 寫鎖已經(jīng)被 session B 獲取 ,故產(chǎn)生鎖等待;當(dāng) session B 嘗試 獲取 id = 1 的寫鎖時 ,由于id =1 寫鎖已經(jīng)被 session A 獲取, 此時 產(chǎn)生鎖等待; 由于 session A 與 session B 同時 都在 鎖 等待狀態(tài),產(chǎn)生了等待對方釋放鎖,故會產(chǎn)生死鎖;

知識追尋者做個試驗

session A 執(zhí)行語句, 獲取 id =1 的 寫鎖權(quán)限;

BEGIN; update `order` set `year`= '2022' where id = '1';

session B 執(zhí)行語句, 獲取 id =2 的 寫鎖權(quán)限;

BEGIN; update `order` set `year`= '2022' where id = '2';

session A 執(zhí)行語句, 嘗試獲取 id =2 的 寫鎖權(quán)限,進(jìn)入鎖等待狀態(tài)

update `order` set `year`= '2022' where id = '2';

session B 執(zhí)行語句, 嘗試獲取 id =1 的 寫鎖權(quán)限,進(jìn)入鎖等待狀態(tài)

update `order` set `year`= '2022' where id = '1';

當(dāng) B 進(jìn)入 鎖等待后就直接報死鎖異常

Deadlock found when trying to get lock; try restarting transaction

3.2 查看死鎖

可以使用 show engine innodb status 查看死鎖

...... *** (1) TRANSACTION: // 事物A TRANSACTION 253507, ACTIVE 474 sec starting index read mysql tables in use 1, locked 1 // 已經(jīng)使用一個鎖 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 17001, OS thread handle 139824777217792, query id 2191731 ...... root updating update `order` set `year`= '2022' where id = '2'//執(zhí)行得語句 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: // 等待鎖釋放獲取鎖 RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253507 lock_mode X locks rec but not gap waiting ..... ? *** (2) TRANSACTION: // 事物 B TRANSACTION 253508, ACTIVE 425 sec starting index read mysql tables in use 1, locked 1 // 已經(jīng)使用一個鎖 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 17002, OS thread handle 139824778569472, query id 2191735 ...... root updating update `order` set `year`= '2022' where id = '1'//執(zhí)行得語句 *** (2) HOLDS THE LOCK(S): //持有鎖 RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253508 lock_mode X locks rec but not gap ...... ? *** (2) WAITING FOR THIS LOCK TO BE GRANTED: // 等待鎖釋放獲取鎖 RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253508 lock_mode X locks rec but not gap waiting ...... ?

不得不說下字母代表鎖得類型如下

  • 共享鎖(S)
  • 排他鎖(X)
  • 意向共享(IS)
  • 意向排他(IX)
  • gap lock(GK), 間隙鎖,鎖定一個范圍,不包括當(dāng)前記錄本身;
  • RECORD LOCKS 代表記錄鎖;

可以看見上面得語句 (1) 代表 事物A ,MYSQL 線程id 17001 ; (2) 代表事物B, MYSQL 線程id 17002 ; 事物 A 與B 都在等待 對方釋放鎖 ,產(chǎn)生了死鎖;

Tip; 查看表鎖 : show status like 'table%';

如何解決死鎖,知識追尋者這邊給個思路:

查找到死鎖線程,殺死MYSQL死鎖的線程(kill命令);

如果事物未提交,直接回滾事物;

3.3 如何避免死鎖

  • 在死鎖容易產(chǎn)生得表使用表鎖不會產(chǎn)生死鎖;
  • 避免交叉使用相同的鎖
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的mysql 查看锁_SQL-mysql锁等待与死锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。