溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mysql數(shù)據(jù)庫(kù)死鎖Deadlock found when trying to get lock怎么解決

發(fā)布時(shí)間:2022-02-28 16:31:56 來(lái)源:億速云 閱讀:4682 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下mysql數(shù)據(jù)庫(kù)死鎖Deadlock found when trying to get lock怎么解決的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

查看mysql死鎖日志

show engine innodb status

找到信息中LATEST DETECTED DEADLOCK這一行,可以看到mysql的死鎖信息詳情

------------------------
LATEST DETECTED DEADLOCK
------------------------
2021-08-25 14:13:37 0x7facac6b8700
*** (1) TRANSACTION:
TRANSACTION 1589867098, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
LOCK WAIT 508 lock struct(s), heap size 57552, 4 row lock(s)
MySQL thread id 201608808, OS thread handle 140379228206848, query id 3088485657 172.18.119.16 root updating
UPDATE web_viewlog SET viewcount=viewcount+1,lasttime='2021-08-25 14:13:37' WHERE uid=2150174 and kename='21es1mmi'
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 564 page no 16179 n bits 208 index PRIMARY of table `w3cschool`.`web_viewlog` trx id 1589867098 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 16; compact format; info bits 0

MySQL有三種鎖的級(jí)別:頁(yè)級(jí)、表級(jí)、行級(jí)。

表級(jí)鎖:開(kāi)銷(xiāo)小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。

行級(jí)鎖:開(kāi)銷(xiāo)大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。

頁(yè)面鎖:開(kāi)銷(xiāo)和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

行級(jí)鎖

行級(jí)鎖在使用的時(shí)候并不是直接鎖掉這行記錄,而是鎖索引
如果一條sql用到了主鍵索引(mysql主鍵自帶索引),mysql會(huì)鎖住主鍵索引;
如果一條sql操作了非主鍵索引,mysql會(huì)先鎖住非主鍵索引,再鎖定主鍵索引.

什么情況下會(huì)造成死鎖

所謂死鎖<DeadLock>: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,
因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。
此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等竺的進(jìn)程稱(chēng)為死鎖進(jìn)程。
表級(jí)鎖不會(huì)產(chǎn)生死鎖.所以解決死鎖主要還是針對(duì)于最常用的InnoDB。

收集死鎖信息:

  1. 利用命令 SHOW ENGINE INNODB STATUS查看死鎖原因。

  2. 調(diào)試階段開(kāi)啟 innodb_print_all_deadlocks,收集所有死鎖日志。

減少死鎖:

  1. 使用事務(wù),不使用 lock tables 。

  2. 保證沒(méi)有長(zhǎng)事務(wù)。

  3. 操作完之后立即提交事務(wù),特別是在交互式命令行中。

  4. 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),嘗試降低隔離級(jí)別。

  5. 修改多個(gè)表或者多個(gè)行的時(shí)候,將修改的順序保持一致。

  6. 創(chuàng)建索引,可以使創(chuàng)建的鎖更少。

  7. 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。

  8. 如果上述都無(wú)法解決問(wèn)題,那么嘗試使用 lock tables t1, t2, t3 鎖多張表

解決方法

首先先用sql查詢(xún)一下mysql的事務(wù)處理表

select * from information_schema.INNODB_TRX;

mysql數(shù)據(jù)庫(kù)死鎖Deadlock found when trying to get lock怎么解決

正常情況下的狀態(tài)都是RUNNING,但是在被鎖之后就會(huì)變成LOCK WAIT ,

一旦出現(xiàn)這種情況,就得殺死這個(gè)進(jìn)程,如果進(jìn)程殺不死就只能重啟Mysql服務(wù)了。


殺死進(jìn)程

kill 進(jìn)程ID

以上就是“mysql數(shù)據(jù)庫(kù)死鎖Deadlock found when trying to get lock怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI