問題の説明
セッションが別のセッションによって保持されている行排他ロックを待つと、行ロック待ちが発生します。 行ロック待機がタイムアウトすると、次のエラーが報告されます。
エラー1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください原因
ほとんどの場合、行排他ロックを保持しているセッションは、関連する操作をすばやく完了し、ロックを解放します。 次に、行排他ロックを待つセッションは、ロックがタイムアウトする前にロックを取得し、関連する動作を実行することができる。 行排他ロックは、トランザクションコミットまたはロールバックを使用して解放できます。 場合によっては、RDSインスタンスは、アプリケーションがデータベースから切断されたという通知を受信せず、セッションが長期間行排他ロックを保持します。 他のセッションが行排他ロックを保持したい場合、多数の行ロック待ちが発生し、行ロック待ちがタイムアウトします。
解決策
このトピックで提供されているメソッドは、行ロック待機が発生した場合にのみ適しています。 ApsaraDB RDS for MySQLでは、行ロック待機のデフォルトのタイムアウト時間は50秒です。 innodb_lock_wait_timeoutを大きな値に設定して、行ロック待ちが発生する状況をシミュレートできます。 本番環境では、innodb_lock_wait_timeoutを大きな値に設定しないことを推奨します。
- データ管理 (DMS) を使用してRDSインスタンスにログインします。 詳細については、「DMSを使用したApsaraDB RDS For MySQLインスタンスへのログイン」をご参照ください。
- 実行中のトランザクションおよび行ロック待ちのトランザクションを表示するには、次の操作を実行します。
- 次のSQLステートメントを実行して、実行中のトランザクションを表示します。
SELECT * FROM information_schema.INNODB_TRX; - 次のSQL文を実行して、行ロックを待っているトランザクションを表示します。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; - 次のSQL文を実行して、ロックされているトランザクションを表示します。
SELECT * からINFORMATION_SCHEMA.INNODB_LOCKS;
- 次のSQLステートメントを実行して、実行中のトランザクションを表示します。
- セッションがブロッカーとして識別される場合、セッションは、他のセッションのDML動作をブロックする行ロックを保持する。 その結果、行ロック待ちが発生し、行ロック待ちがタイムアウトする。 セッションのトランザクションをロールバックできる場合は、トランザクションをロールバックして行ロックを解除できます。
- 問題が解決しない場合は、[ブロック] タブに移動して、長期間ブロックを発生させるセッションを特定し、セッションの詳細を表示します。 詳細については、「ApsaraDB RDS For SQL Serverインスタンスのブロッキング統計の表示」をご参照ください。
適用範囲
ApsaraDB RDS for MySQL