トランザクションの単純なINSERTステートメントがMySQLのさまざまな行でDELETEステートメントをブロックし、最終的にロックタイムアウトエラーでDELETEステートメントセッションタイムアウトが発生するというシナリオがアプリケーションにあります。mysqlロック待ちタイムアウトエラー
以下の簡単なシナリオで状況を説明しようとしました。ただし、DELETEのWHERE句に2つのカラムがある場合は、ロック待機タイムアウトが表示されます。また、トランザクションを開始した後、他の処理をほとんど行う必要がないため、コミットまたはロールバックするのに数分かかることに注意してください。私が挿入しようとしているものとは異なるレコードを削除しても、MySQLはそれをブロックするとは信じがたいです。
セッション1: -
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation |
+-----------------------+----------------+------------------------+
| READ-COMMITTED | READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+------------------------+
1 row in set (0.02 sec)`
mysql> create table testtab(col1 int, col2 int);
Query OK, 0 rows affected (0.53 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO testtab values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO testtab values(2,2);
Query OK, 1 row affected (0.00 sec)
セッション2: -
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation |
+-----------------------+----------------+------------------------+
| READ-COMMITTED | READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+------------------------+
1 row in set (0.00 sec)
mysql> DELETE FROM testtab where col1=3;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
任意の提案ですか?
Solarflareに感謝します。あなたは一所懸命でした。クエリをブロックする(セッション2のみの完全なprocesslist showクエリを表示する)場合、私はどのようなオプションを持っているのですか?類似の例については – DBPlayer
です。私はshow engine innodb status、full process list etcを試してみましたが、実際にトランザクションを長時間実行させているINSERT文は何も表示されていないようです。 – DBPlayer