天天看點

MySql事物被死鎖解決辦法

出現:Lock wait timeout exceeded;try restarting transaction錯誤時

這時候隻需要去mysql中查兩個語句,然後殺掉對應的死鎖線程就行:

1.查詢mysql所有正在執行的sql,看到query就說明是正在執行的,有時候慢查詢導緻程式卡住無響應也可以這麼清除

show processlist;

kill id;

2.檢視mysql事物表INNODB_TRX,在information_schema庫中

SELECT * FROM information_schema.innodb_trx ;

kill trx_mysql_thread_id;

殺掉死鎖的事務線程重新啟動項目,這時再運作就不會出錯。

 問題出現環境: 

1、在同一事務内先後對同一條資料進行插入和更新操作; 

2、多台伺服器操作同一資料庫; 

3、瞬時出現高并發現象;

原因分析

在高并發的情況下,Spring事物造成資料庫死鎖,後續操作逾時抛出異常。

Mysql資料庫采用InnoDB模式,預設參數:innodb_lock_wait_timeout設定鎖等待的時間是50s,一旦資料庫鎖超過這個時間就會報錯。

出現這種問題也有可能是磁盤的空間不足,mysql執行sql時生成的臨時表溢出,這時需要去清理磁盤或者增加磁盤的空間。因為我殺掉被死鎖的事物後,雖然當時已經可以正常使用,但過一會相同的問題又出現了,最後通過列印出的日志發現,執行sql時,生成的臨時檔案溢出,才發現是磁盤的空間不足,清理磁盤後就正常了,不會再出現資料庫被死鎖的問題。