BEGIN; UPDATE t3 SET ... WHERE id=19; **未提交**,處於 Sleep 狀態持有行鎖。UPDATE t3 SET ... WHERE id=19; 等待鎖超時,報 ERROR 1205 (HY000): Lock wait timeout exceeded。SHOW PROCESSLIST 只見 Sleep,**無法直接看出誰持有鎖**。SHOW ENGINE INNODB STATUS\G → 手動分析 TRANSACTIONS 區塊,**信息冗長、難自動化**。information_schema.INNODB_TRX。SELECT * FROM information_schema.INNODB_TRX\G
關鍵輸出字段:
| 字段 | 含義 |
|---|---|
trx_id | 事務 ID |
trx_state | RUNNING/LOCK WAIT/ROLLING BACK |
trx_started | 事務開始時間 |
trx_mysql_thread_id | **MySQL 線程 ID(對應 SHOW PROCESSLIST 的 Id)** |
trx_query | 當前執行/最後執行的 SQL |
trx_tables_locked | 鎖定表數 |
trx_rows_locked | 鎖定行數 |
trx_isolation_level | 隔離級別 |
*************************** 1. row *************************** trx_id: 189324 trx_state: RUNNING trx_started: 2013-04-18 17:48:14 trx_mysql_thread_id: 16 -- 就是這個線程! trx_query: NULL -- 空查詢,說明在事務中間空閒 trx_tables_locked: 1 trx_rows_locked: 3 trx_rows_modified: 1 trx_isolation_level: REPEATABLE READ
結論:線程 16 開啟事務後修改數據,**忘記 COMMIT/ROLLBACK**,長時間持有鎖導致阻塞。
KILL 16; -- 直接殺掉持鎖線程,事務自動回滾,釋放鎖
線程 B 即可繼續執行。