【Mysql】mysql鎖等待Lock wait timeout exceeded; try restarting transaction

# 查詢全局等待事務鎖超時時間
SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
 
# 設置全局等待事務鎖超時時間
SET  GLOBAL innodb_lock_wait_timeout=100;
 
# 查詢當前會話等待事務鎖超時時間
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
 

 

 

問題場景 
問題出現環境: 
1、在同一事務內先後對同一條數據進行插入和更新操作; 
2、多臺服務器操作同一數據庫; 
3、瞬時出現高並發現象;

原因分析 
在高併發的情況下,Spring事物造成數據庫死鎖,後續操作超時拋出異常。 
Mysql數據庫採用InnoDB模式,默認參數:innodb_lock_wait_timeout設置鎖等待的時間是50s,一旦數據庫鎖超過這個時間就會報錯。
 

解決方案 
1. 運行以下命令,查找提交事務的數據,殺掉線程即可解決

select * from information_schema.innodb_trx
 
kill thread_id;
 2. 增加鎖等待時間,即增大下面配置項參數值,單位爲秒(s)

innodb_lock_wait_timeout=500
3、優化存儲過程,事務避免過長時間的等待。

如下圖,殺的是這個ID