1. 程式人生 > >控制檯顯示修改成功,資料庫對應資料未修改,報lock wait timeout exceeded異常

控制檯顯示修改成功,資料庫對應資料未修改,報lock wait timeout exceeded異常

出現原因

在高併發的情況下,Spring事物造成資料庫死鎖,後續操作超時丟擲異常。 
Mysql資料庫採用InnoDB模式,預設引數:innodb_lock_wait_timeout設定鎖等待的時間是50s,一旦資料庫鎖超過這個時間就會報錯。

解決方案

1.

 第一步 

先用這條命令查詢資料庫阻塞的程序

SELECT * FROM information_schema.innodb_trx     

第二步

主要看著幾個欄位(比如:trx_rows_locked),如果有阻塞資料就不是0,找到後在根據下圖這個欄位殺死程序

kill 程序ID

2.增加鎖等待時間,即增大下面配置項引數值,單位為秒(s)

innodb_lock_wait_timeout=500

3.優化儲存過程,事務避免過長時間的等待。 

1、鎖等待超時。是當前事務在等待其它事務釋放鎖資源造成的。可以找出鎖資源競爭的表和語句,優化SQL,建立索引等。如果還是不行,可以適當減少併發執行緒數。 
2、事務在等待給某個表加鎖時超時,估計是表正被另的程序鎖住一直沒有釋放。 
可以用 SHOW INNODB STATUS/G; 看一下鎖的情況。 
3、搜尋解決之道,在管理節點的[ndbd default]區加: 
TransactionDeadLockDetectionTimeOut=10000(設定 為10秒)預設是1200(1.2秒) 
4、InnoDB會自動的檢測死鎖進行回滾,或者終止死鎖的情況。
--------------------- 

原文:https://blog.csdn.net/moshenglv/article/details/78864059