線程 A 開啟事務更新某行但未提交(顯示 Sleep);線程 B 更新同行報 ERROR 1205 (HY000): Lock wait timeout exceeded。
輸出冗長、需人工匹配 MySQL thread id、trx_id、鎖記錄資訊,易漏讀。
SELECT * FROM information_schema.INNODB_TRX\G
| 欄位 | 含義 |
|---|---|
trx_id | 事務 ID |
trx_state | RUNNING / LOCK WAIT |
trx_mysql_thread_id | 對應 SHOW PROCESSLIST 的 Id |
trx_query | 正在執行/最後執行的 SQL |
trx_requested_lock_id | 等待的鎖 ID(若為 LOCK WAIT) |
trx_wait_started | 開始等待時間 |
trx_state = 'RUNNING' 且 trx_query IS NULL 或為舊更新語句的事務trx_mysql_thread_id(例:16)KILL 16;SELECT r.trx_id waiting_trx, r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx, b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.INNODB_LOCK_WAITS w
JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id
JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id;
innodb_lock_wait_timeout 適中值(預設 50s)innodb_print_all_deadlocks=ON 記錄死鎖日誌供事後分析