出現: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時,生成的臨時檔案溢出,才發現是磁盤的空間不足,清理磁盤後就正常了,不會再出現資料庫被死鎖的問題。