最近線上專案突然出現:lock wait timeout exceeded;try restarting transaction這個錯誤
出現這個錯誤時只需要去mysql中查詢兩個語句,然後殺掉對應的死鎖執行緒就行:
查詢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、瞬時出現高併發現象;
不斷的有一下異常丟擲,異常資訊:
lock wait timeout exceeded;try restarting transaction
原因分析
在高併發的情況下,spring事物造成資料庫死鎖,後續操作超時丟擲異常。
mysql資料庫採用innodb模式,預設引數:innodb_lock_wait_timeout設定鎖等待的時間是50s,一旦資料庫鎖超過這個時間就會報錯。
解決方案
1、通過下面語句查詢到為提交事務的資料,kill掉此執行緒即可。
select * from information_schema.innodb_trx
kill id ;(殺死對應id的程序)
但是經過處理還是不斷的出現此問題,經過多方面分析,最後看到列印的日誌上報mysql執行sql時生成的臨時表溢位,磁碟的空間不足,這時需要去清理磁碟或者增加磁碟的空間,可以正常使用了。
關於資料庫死鎖
不鎖怕出事,鎖了又怕鎖死了!資料庫由於資料儲存速度快,資料穩定,結構化的特性,被廣泛用作資料儲存,並成為最重要,最常見的方式!資料庫從20世紀50年代誕生伊始,就因為支援事務的特性得到大力的發展,最終各種資料庫諸如oracle,sybase,mysql等關係型資料庫百花齊放,既然資料庫是因為事務而生...
mysql資料庫死鎖
當我們頻繁的對資料庫進行插入或更新的時候,有可能會直接報sql錯誤1205 lock wait timeout exceeded。資料庫的死鎖。一般innodb資料庫會自動新增事務,當進行插入或者更新的時候,如果上次commit尚未執行完,而又有一次新的commit提交的時候,系統就會報sql錯誤1...
MySQL 資料庫死鎖
也可以根據物件模糊匹配直接查詢死鎖的session資訊select vl.session id b.serial ao.object name,b.from vlocked object vl,all objects ao,vsession b where vl.object id ao.objec...