關(guān)于Mysql 查詢是否存在鎖表,這里介紹一種常用的方式颈将。
該方式思路是查詢出被鎖的事務(wù)和對(duì)應(yīng)的sql梢夯,然后找到被鎖的事務(wù)ID,緊急的處理是:使用事務(wù)ID晴圾,進(jìn)行kill id來(lái)釋放鎖颂砸。 然后根據(jù)sql慢慢定位到對(duì)應(yīng)的功能點(diǎn),分析出現(xiàn)死鎖的原因死姚,對(duì)業(yè)務(wù)代碼進(jìn)行修改徹底解決問(wèn)題人乓,一般情況下死鎖出現(xiàn)是因?yàn)闃I(yè)務(wù)代碼的寫(xiě)法有問(wèn)題導(dǎo)致的,出現(xiàn)一次后不解決都毒,后面還需繼續(xù)出現(xiàn)
1色罚、查看正在進(jìn)行中的事務(wù)
SELECT * FROM information_schema.INNODB_TRX
2、查看正在鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3温鸽、查看等待鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4保屯、查詢是否鎖表
SHOW OPEN TABLES where In_use > 0;
在發(fā)生死鎖時(shí),這幾種方式都可以查詢到和當(dāng)前死鎖相關(guān)的信息涤垫。
5姑尺、查看最近死鎖的日志
show engine innodb status
解除死鎖
如果需要解除死鎖,有一種最簡(jiǎn)單粗暴的方式蝠猬,那就是找到進(jìn)程id之后切蟋,直接干掉。
查看當(dāng)前正在進(jìn)行中的進(jìn)程
show processlist
// 也可以使用
SELECT * FROM information_schema.INNODB_TRX;
這兩個(gè)命令找出來(lái)的進(jìn)程id 是同一個(gè)榆芦。
殺掉進(jìn)程對(duì)應(yīng)的進(jìn)程 id
kill id
驗(yàn)證(kill后再看是否還有鎖)
SHOW OPEN TABLES where In_use > 0;