問題出現環境:
1、在同一交易內先後對同一資料進行插入和更新操作;
2、多台伺服器操作相同資料庫;
3.瞬時出現高並發現象;
不斷的有一下異常拋出,異常訊息:
SQL:-----後面為SQL語句及堆疊資訊--------org.springframework.dao.CannotAcquireLockException:
# Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
The error may involve com.*.dao.mapper.PhoneFlowMapper.updateByPrimarySelective-Inline #ocv 它while setting parameters
原因分析
解決方案
1、透過下面語句查找到為提交交易的數據,kill掉此線程即可。
select * from information_schema.innodb_trx
2、增加鎖定等待時間,即增加下面配置項目參數值,單位為秒(s)
innodb_lock_wait_timeout=500
參考資訊
1、鎖定等待逾時。是當前事務在等待其它事務釋放鎖資源所造成的。可以找出鎖定資源競爭的表和語句,優化SQL,建立索引等。如果還是不行,可以適當減少並發線程數。
可以用 SHOW INNODB STATUS/G; 看鎖定的情況。
TransactionDeadLockDetectionTimeOut=10000(設定為10秒)預設為1200(1.2秒)
4 、InnoDB會自動的偵測死鎖進行回滾,或是終止死鎖的情況。InnoDB automatically detects transaction deadlocks and rolls back a transaction or transactions to break the deadlock. InnoDB tries to pick small transactions to roll back, where the size of aser transaction is determined by the nted , updated, or deleted.
以上是Mysql事物鎖定等待逾時Lock wait timeout exceeded;怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!