MySQLがロックされる原因
MySQL がロックされる主な理由は次のとおりです。
- テーブルロック:テーブル全体をロックする操作を実行すると、MySQLはテーブルをロックし、他のセッションはそのテーブルに対して読み書き操作を実行できなくなります。一般的なのはLOCK TABLESステートメントまたはALTER TABLEステートメントを使用する場合です。
- 行ロック:複数のセッションが同時に同じ行データを操作すると、MySQLはその行データをロックし、他のセッションはその行データを変更できなくなります。よくあるパターンは、SELECT … FOR UPDATE文やUPDATE文を使用している場合です。
- ギャップロック:クエリ条件が範囲検索を使用すると、MySQLはクエリ範囲内のギャップにロックを設定して、他のセッションがそのギャップにデータを挿入できないようにします。一般的なのは、SELECT … FOR UPDATEステートメントまたはUPDATEステートメントを使用する場合です。
- MDLロック: MySQLデータディクショナリーのメタデータ情報が変更された際、メタデータの一貫性を保護するためにMDLロックが使用されます。MDLロックは読取りロックであり、複数のセッションが同時に読取りロックを取得できますが、書き込みロックを取得できるのは1つのセッションのみです。
- デッドロック:複数のセッションがロックを保持し合って、お互いにロックの解放を待っている状態のこと。MySQL では、デッドロックを検出し、そのうちの 1 つのセッションのトランザクションをロールバックします。
これらは MySQL がロックされる主な原因なので、デベロッパーはデータベースの設計と SQL ステートメントの記述時に、データベースの並行パフォーマンスを高めるために、不要なロックが発生しないように注意を払う必要があります。