首頁 >資料庫 >mysql教程 >Mysql事物鎖定等待逾時Lock wait timeout exceeded;怎麼辦

Mysql事物鎖定等待逾時Lock wait timeout exceeded;怎麼辦

PHPz
PHPz轉載
2023-06-03 11:32:473048瀏覽

問題場景

問題出現環境:
1、在同一交易內先後對同一資料進行插入和更新操作;
2、多台伺服器操作相同資料庫;
3.瞬時出現高並發現象;

不斷的有一下異常拋出,異常訊息:

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

SQL:-----後面為SQL語句及堆疊資訊-------- 

原因分析

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

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

解決方案

1、透過下面語句查找到為提交交易的數據,kill掉此線程即可。

select * from information_schema.innodb_trx

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會自動的偵測死鎖進行回滾,或是終止死鎖的情況。

InnoDB automatically detects transaction deadlocks and rolls back a transaction or transactions to break the deadlock. InnoDB tries to pick small tr​​ansactions to roll back, where the size of aser transaction is determined by the nted , updated, or deleted.


如果參數innodb_table_locks=1並且autocommit=0時,InnoDB會留意表的死鎖,和MySQL層面的行級鎖定。另外,InnoDB不會偵測MySQL的Lock Tables指令和其他儲存引擎死鎖。你應該設定innodb_lock_wait_timeout來解決這種情況。 ###innodb_lock_wait_timeout是Innodb放棄行級鎖定的逾時時間。 ###

以上是Mysql事物鎖定等待逾時Lock wait timeout exceeded;怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除