編碼的世界 / 優質文選 / 歷史

mysql死鎖怎麼解決


2022年7月31日
-   

1,查看數據庫的隔離級別:
mysql> select @@tx_isolation;
 
2,去查看先當前庫的線程情況:
mysql> show processlist;

沒有看到正在執行的慢SQL記錄線程,再去查看innodb的事務表INNODB_TRX,看下裏面是否有正在鎖定的事務線程,看看ID是否在show full processlist裏面的sleep線程中,如果是,就證明這個sleep的線程事務一直沒有commit或者rollback而是卡住了,我們需要手動kill掉。
mysql> SELECT * FROM information_schema.INNODB_TRX;

 
如果有記錄,則找到trx_mysql_thread_id這個字段對應的id, 將其kill掉。假如id=100
mysql->kill  100
SELECT CONCAT_WS('','kill',' ',t.trx_mysql_thread_id,';')a FROM information_schema.INNODB_TRX t;
4,總結分析
表數據量也不大,按照普通的情況來說,簡單的update應該不會造成阻塞的,mysql都是autocommit,不會出現update卡住的情況,去查看下autocommit的值。 mysql> select @@autocommit;

1表示自動提交。0表示不自動提交。
如果你發現自己的數據庫autocommit=0,將它改正吧。
 
最後。
解除死鎖的兩種方法:(1)終止(或撤銷)進程。終止(或撤銷)系統中的一個或多個死鎖進程,直至打破循環環路,使系統從死鎖狀態中解除出來。
(2)搶占資源。從一個或多個進程中搶占足夠數量的資源,分配給死鎖進程,以打破死鎖狀態。

熱門文章