記一次MySQL死鎖


記錄一次MySQL表無法訪問

​ 在一次真實的開發測試中突然發現數據庫中訂單表 select、update、delete 沒有絲毫反應。以為是服務器性能過低導致MySQL進程執行過慢,但是等待10分鍾訂單表依然毫無反應,更奇怪的是其他表都可正常操作數據。這時我覺得是訂單表壞了,想把訂單表drop 掉 ,一樣無果。玄學!

排查

1.與同事交流之中,得知他剛剛在訂單表之中增加一個字段之后 MySQL客戶端就一直卡住。他直接強制關閉MySQL連接客戶端 , 之后訂單表無法使用。

2.執行下面命令之后,發現是訂單表死鎖,導致的問題

SHOW OPEN TABLES WHERE IN_USE > 0;

3.查詢死鎖的進程

SHOW PROCESSLIST

4.殺掉死鎖進程ID

KILL ID

法二

1.查看鎖事務

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

2.殺掉死鎖進程ID

KILL ID

MySQL死鎖條件

(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM