目次
序文:
MySQL デッドロックとは、複数のセッションが同時に同じリソースを要求した場合に発生するリソース競合現象を指し、その結果、セッションが実行を継続できなくなります。デッドロックが発生すると、トランザクションのコミットまたはロールバックが失敗し、アプリケーションの通常の動作に影響します。したがって、MySQL のパフォーマンスのテストとチューニングでは、デッドロックに対処する必要があります。
1. デッドロックの検出
SQL ステートメントを使用して、ロック テーブルに関する関連情報をクエリします。
(1) テーブルオープン状態の問い合わせ
IN_USE> 0 の開いているテーブルを表示
(2) ロック状態リストの問い合わせ
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
(3) ロック待機情報を照会します。blocking_lock_id は、現在のトランザクションが待機しているトランザクションです。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
(4) デッドロックログの問い合わせ
エンジンの INNODB ステータスを表示
このステートメントで表示できるのは最新のデッドロックのみであり、システム内で発生したすべてのデッドロック情報を完全に取得することはできません。すべてのデッドロック ログを記録したい場合は、innodb_print_all_deadlocks パラメータを開いてすべてのデッドロック ログをエラーログに記録する必要があります。
(5) クエリロック待ち時間
「%lock%」のようなステータスを表示
2. デッドロックの回避
デッドロックが発生する場合は、通常、プロジェクトのプログラム内のトランザクションに時間がかかるか、分離レベルの設定が不適切であることが原因です。トランザクションを使用する場合は、次の点に注意する必要があります。
(1) トランザクションを短く簡潔に保ち、デッドロックの可能性を減らすために、関連する一連の更新操作を実行した直後にトランザクションを送信します。特に、関連する MySQL セッションがコミットされていないトランザクションを長時間ハングさせないでください。
(2) READ COMMITTED など、より低い分離レベルを使用することをお勧めします。
(3) 同一トランザクション内で複数のテーブルを変更する場合、またはテーブル内の異なる行を変更する場合は、毎回同じ順序で操作を実行してください。デッドロックを回避するために、トランザクションがクリア ロック操作キューを形成できるようにするため。
3. デッドロックの解決策
MySQL データベースは、デッドロック検出 (innodb_deadlock_detect) とデッドロック タイムアウト (innodb_lock_wait_timeout) の 2 つのパラメーターを通じてデッドロックを解決します。
デッドロック検出 (innodb_deadlock_detect): MySQL 8.0 では、InnoDB がデッドロック検出を実行するかどうかを制御するために、新しい動的変数 innodb_deadlock_detect が追加されました。このパラメータのデフォルト値は ON、つまりデッドロック検出がオンになっています。有効にすると、InnoDB はロック時にデッドロックが発生するかどうかを検出し、ロックされる場合は最小限のコストでトランザクションをロールバックします。
デッドロック タイムアウト (innodb_lock_wait_timeout): このパラメーターは、検出できないデッドロックに対処したり、長いトランザクションの長時間の待機を回避したりするために使用できます。
同時実行性の高いシステムでは、多数のスレッドが同じロックを待機すると、デッドロックの検出によりパフォーマンスが低下する可能性があります。この時点で、デッドロック検出を無効にし、代わりにパラメーター innodb_lock_wait_timeout に依存して、ロック リソースを長時間占有するトランザクションを解放する方が効率的である可能性があります。つまり、デッドロック検出機能がシステムのパフォーマンスに影響を及ぼし、デッドロック検出を無効にしても悪影響がないことが確認された場合は、 innodb_deadlock_detect オプションをオフにしてみてください。さらに、InnoDB デッドロック検出が無効になっている場合は、実際のニーズに合わせてパラメーター innodb_lock_wait_timeout の値を調整する必要があります。
ここに来た者として、皆さんが寄り道をしないように願っていますが、ここでは、自動テストを進める上で必要なことをいくつか共有し、皆さんのお役に立てれば幸いです。(WEB 自動テスト、アプリ自動テスト、インターフェイス自動テスト、継続的インテグレーション、自動テスト開発、大規模な工場面接の質問、履歴書のテンプレートなど)、より良い進歩をもたらすことができると信じています。