問題の説明
ApsaraDB RDS for MySQL で、以下のエラーが報告されます。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
information_schema.innodb_trx テーブルをクエリすると、trx_mysql_thread_id の値が 0 の未コミットのトランザクションが見つかります。
mysql> select * from information_schema.innodb_trx\G
*************************** 1. row ***************************
trx_id: 7617846
trx_state: RUNNING
trx_started: 2024-11-26 14:25:05
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 4
trx_mysql_thread_id: 0
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 1128
trx_rows_locked: 2
trx_rows_modified: 2
trx_concurrency_tickets: 0
trx_isolation_level: READ COMMITTED
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
trx_schedule_weight: NULL
1 row in set (0.04 sec)原因
trx_mysql_thread_id の値が 0 の場合は、XA トランザクション (分散トランザクションの一種) を示します。この未コミットのトランザクションがロックを保持しているため、ロック待ちが発生します。
ソリューション
XA RECOVER;を実行して、未コミットの XA トランザクションをリストします。mysql> xa recover; +----------+----------------+--------------+---------+ | formatID | gtrid_length | bqual_length | data | +----------+----------------+--------------+---------+ | 100 | 3 | 4 | 123_abc | +----------+----------------+--------------+---------+ 1 row in set (0.03 sec)説明XA RECOVER;の出力に文字化けが含まれる場合は、XA RECOVER CONVERT XID;を実行してください。要件に応じて、未コミットの XA トランザクションをロールバックまたはコミットします。
XA COMMIT 構文を使用して XA トランザクションをコミットできます。
xa commit 'gtrid_length(data)','bqual_length(data)',formatID;出力例に基づくと、ステートメントは次のようになります。
xa commit '123','_abc',100;XA ROLLBACK 構文を使用して XA トランザクションをロールバックできます。
xa rollback 'gtrid_length(data)','bqual_length(data)',formatID;出力例に基づくと、ステートメントは次のようになります。
xa rollback '123','_abc',100;
XA トランザクションの構文に関する詳細については、「MySQL 公式ドキュメント」をご参照ください。