1. 程式人生 > 其它 >已解決:Lock wait timeout exceeded; try restarting transaction死鎖問題

已解決:Lock wait timeout exceeded; try restarting transaction死鎖問題

Lock wait timeout exceeded; try restarting transaction

超過鎖定等待超時;嘗試重新啟動事務

發生原因:流程不嚴謹問題導致SQL執行操作了全部資料,導致update語句執行時間過長導致死鎖。

發生現象:死鎖導致表被鎖定,系統其他對這個表的RUD操作會被卡住,導致報錯等一系列問題。

排查步驟

使用命令視窗或者Navicat連線資料庫後使用以下命令語句進行排查:

檢視當前資料庫所有的執行中的程序。

show processlist;

在結果列表裡可以看到資料庫下所有的程序,以及相關語句。

id:程序ID,如果需要結束某個程序可以直接kill執行緒id,例如:kill 1。

user:當前使用者,如果不是root,這個命令只會顯示你許可權範圍內的sql語句。

host:顯示這個語句是從哪個ip的哪個埠上發出的。可用來追蹤出問題語句的使用者。

db:顯示這個程序目前連線的是哪個資料庫。

command:顯示當前連線的執行的命令,一般就是休眠(sleep),查詢(query),連線(connect)。

檢視資料庫中當前執行的所有事務:

select * from information_schema.innodb_trx;

在結果列表中可以看到是否有表鎖等待或者死鎖,如果有死鎖發生,可以通過一下命令來殺掉當前執行的事務。

kill581; kill後面的數字是 trx_mysql_thread_id列的值。

自己解決這個問題的時候也是參考的這個結果列表,可以根據對應的SQL語句,以及trx_started:事務開始時間欄位,開始時間欄位可以看到是否已經開始很長一段時間。

根據對應的SQL語句進行分析優化或者殺掉對應的事務即可。

trx_id:事務ID。
trx_state:事務狀態,有以下幾種狀態:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
trx_started:事務開始時間。
trx_requested_lock_id:事務當前正在等待鎖的標識,可以和 INNODB_LOCKS 表 JOIN 以得到更多詳細資訊。
trx_wait_started:事務開始等待的時間。


trx_weight:事務的權重。
trx_mysql_thread_id:事務執行緒 ID,可以和 PROCESSLIST 表 JOIN。
trx_query:事務正在執行的 SQL 語句。
trx_operation_state:事務當前操作狀態。
trx_tables_in_use:當前事務執行的 SQL 中使用的表的個數。
trx_tables_locked:當前執行 SQL 的行鎖數量。
trx_lock_structs:事務保留的鎖數量。
trx_lock_memory_bytes:事務鎖住的記憶體大小,單位為 BYTES。
trx_rows_locked:事務鎖住的記錄數。包含標記為 DELETED,並且已經儲存到磁碟但對事務不可見的行。
trx_rows_modified:事務更改的行數。
trx_concurrency_tickets:事務併發票數。
trx_isolation_level:當前事務的隔離級別。
trx_unique_checks:是否開啟唯一性檢查的標識。
trx_foreign_key_checks:是否開啟外來鍵檢查的標識。
trx_last_foreign_key_error:最後一次的外來鍵錯誤資訊。
trx_adaptive_hash_latched:自適應雜湊索引是否被當前事務鎖住的標識。
trx_adaptive_hash_timeout:是否立刻放棄為自適應雜湊索引搜尋 LATCH 的標識。