首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 死鎖排查實戰:從 INNODB_TRX 定位阻塞線程並 KILL

     編輯:MySQL 資料庫相關知識

問題現場重現

線程 A 開啟事務更新某行但未提交(顯示 Sleep);線程 B 更新同行報 ERROR 1205 (HY000): Lock wait timeout exceeded。

傳統 show engine innodb status 分析痛點

輸出冗長、需人工匹配 MySQL thread id、trx_id、鎖記錄資訊,易漏讀。

高效解法:直接查 INFORMATION_SCHEMA.INNODB_TRX

SELECT * FROM information_schema.INNODB_TRX\G

關鍵欄位解讀

欄位含義
trx_id事務 ID
trx_stateRUNNING / LOCK WAIT
trx_mysql_thread_id對應 SHOW PROCESSLIST 的 Id
trx_query正在執行/最後執行的 SQL
trx_requested_lock_id等待的鎖 ID(若為 LOCK WAIT)
trx_wait_started開始等待時間

實戰定位步驟

  1. 執行上述查詢,找 trx_state = 'RUNNING' 且 trx_query IS NULL 或為舊更新語句的事務
  2. 記下其 trx_mysql_thread_id(例:16)
  3. 確認無業務邏輯依賴該事務後,執行 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 記錄死鎖日誌供事後分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved