關於mysql資料庫中事物死鎖

2021-09-27 09:22:37 字數 943 閱讀 7110

最近線上專案突然出現: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...