PR:この記事にはアフィリエイトリンクが含まれます。
MySQLのInnoDBでデッドロックが起きると、画面に突然エラーが出ます。驚きますよね。ただ、原因をアクセスの多さだけと決めつけることはできません。どの処理がどの順番でロックを取り、何を待っていたのか。そこを追えば修正箇所が見えてきます。
まず確認するのは、エラーを起こしたSQLと、そこで発生したロック待ちの関係です。仕組みの理解から再発対策まで、実務に結び付ける本を早見表にまとめました。
| 書籍 | 参考価格(税込) | 扱う内容 |
|---|---|---|
MySQL運用・管理[実践]入門 ~安全かつ高速にデータを扱う内部構造・動作原理を学ぶ | 3,080円 | InnoDBのロック、デッドロック表示と事例、ロック観測、運用 |
おうちで学べるデータベースのきほん 第2版 | 2,640円 | 複数接続の実習、分離レベル、ロックタイムアウト、デッドロック |
MySQL徹底入門 第5版 MySQL 8.4 LTS対応 | 4,620円 | MySQL運用全般、状態確認、診断、レプリケーションなど |
価格は各書の希望小売価格が目安です。実売価格や在庫は販売店や時期で変わるため、購入時に確認してください。
デッドロックの正体
デッドロックは、複数のトランザクションが相手のロックを待ち、どちらも先へ進めなくなる状態です。待ちの関係が輪になっているのが特徴ですね。
たとえば、処理Aが口座10を更新してから口座20へ進み、処理Bは口座20から口座10へ進むとします。互いに一つ目のロックを取った直後に同時進行すると、相手が持つ行の解放を待つことになります。
InnoDBは待ちの関係を検出し、片方のトランザクションをロールバックして輪をほどきます。一般に変更量の小さい処理が選ばれる傾向はありますが、毎回同じ側が止まるとは限りません。
このエラーは、InnoDBが一方のトランザクションを取り消した合図です。データ破損を示すものではありません。アプリ側では、トランザクションの最初から再試行できるよう設計します。
ロックが重なる場面
普通のSELECTは通常、一貫性読み取りとして動きます。一方、UPDATEやDELETE、SELECT … FOR UPDATEは行を変更したり確保したりするため、ほかの処理とロックが競合します。
ロック対象はテーブルに加え、インデックス上のレコードにも及びます。検索に使うインデックスや実行計画で走査範囲が広がれば、ロック範囲も広がることがあります。
範囲検索では、分離レベルや検索条件に応じてギャップロックやネクストキーロックが関係します。WHERE句で指定した行以外も関わることがあり、思ったより待ちが長引く場合もあります。
画面入力や外部APIの応答を待つ間、トランザクションを開いたままにする設計も要注意。SQLの実行は一瞬でも、COMMITまで時間がかかれば、その間ロックを持ち続けることがあります。
待ちと競合を分ける
デッドロックは待ちの輪を検出した状態です。ロック待ちタイムアウトは、ロックを待つ処理が設定時間を超えた状態。表示が似ていても、発生条件は違います。
代表的なエラー番号は、デッドロックが1213、ロック待ちタイムアウトが1205です。タイムアウトでは通常、該当文だけが取り消されます。設定によってトランザクション全体がロールバックされる場合もあります。
発生時刻と対象SQLに加え、トランザクション開始からCOMMITまでを記録しましょう。同じ画面エラーでも、待ちの相手や巻き戻る範囲が異なれば対応も変わります。
再試行は有効な対処です。ただし、回数無制限で即座に繰り返すと負荷が上がります。回数に上限を設け、待ち時間を少しずつ延ばせば、競合中のデータベースへ処理が再集中するのを抑えられます。
調査の入口
障害が起きた時刻とエラー番号、発生したSQLを記録します。続けてトランザクション境界とアプリケーションの処理IDをそろえると、アプリのログとデータベース側の記録を結び付けやすくなります。
SHOW ENGINE INNODB STATUSには、直近に検出されたデッドロックの情報が表示されます。次の事象で内容が上書きされる場合もあるため、検出直後に保存してください。
MySQL 8では、Performance Schemaのdata_locksやdata_lock_waitsから保持中のロックと待ちの関係を調べられます。参照権限や監視項目は利用環境で確認しましょう。
SQLだけを見て原因を決めるのは危険です。テーブル定義やインデックス、実行計画も合わせて確認します。同じUPDATEでも、使われるインデックスが違えばロックする行や順番が変わるためです。
再現で因果を追う
検証環境に接続を二つ用意します。一方で行Aを更新し、もう一方では行Bを更新。その後に互いの行へ進めば、待ちの輪を再現できます。
競合はタイミングに左右されるので、SQLを続けて実行するだけでは再現しないことがあります。各接続を一時停止し、最初の更新後に次の更新へ進むよう制御すると、因果関係を確かめやすくなります。
検証環境のMySQLバージョンは本番にそろえます。分離レベルやインデックス、データ量もできるだけ近づけましょう。条件を一つずつ変え、インデックス追加や更新順の変更で待ちが減るか確認します。
再現したときのSQL、ロック情報、エラー表示はひと組で保存してください。次の障害で照合できますし、担当者の記憶だけに頼らない記録になります。
観測情報をつなぐ
SHOW PROCESSLISTは、実行中の処理や待ちをすばやく見る入口です。ただし、接続がSleep表示でも、未コミットのトランザクションがロックを持っている場合があります。
Performance Schemaでロック待ちと実行中のSQLを確認し、アプリケーションログの時刻と結び付けると、ブロッカーを特定しやすくなります。すでに終わった短い競合は、監視画面の瞬間値だけでは拾えないこともあります。
スロークエリログは遅いSQLを見つけるのに役立ちます。誰が誰をブロックしたかは、これだけでは分かりません。実行計画やトランザクションの履歴も合わせて判断しましょう。
詳細なロック情報を常時大量に記録する必要はありません。エラー時に採取する手順を整え、平常時は発生件数や待ち時間の推移を追えば、運用しやすくなります。
再発を減らす設計
複数行を更新する処理では、ロックを取る順序を統一します。たとえば口座IDの昇順です。すべての処理に共通のルールを設ければ、待ちの輪が生じにくくなります。
トランザクションに含める処理は必要なものに絞りましょう。外部APIの呼び出しやユーザー入力を待つ間は開いたままにしません。ロックの保持時間を短くすると、別の処理とぶつかる機会も減ります。
適切なインデックスがあれば検索範囲を狭め、不要なロックを抑えられます。追加後は実行計画と更新負荷も確認してください。検索が速くなる一方で、書き込み時に保守するインデックスは増えます。
デッドロック後の再試行では、外部通知や決済が重複しないか確認が必要です。再試行回数の上限と発生率の記録を決め、SQLの改善も続けましょう。
実践入門の強み
『MySQL運用・管理[実践]入門』は技術評論社から2024年5月に発売された紙書籍です。B5変形判232ページで、InnoDBレイヤのロックや分離レベルとロックの関係を扱います。
デッドロック検出の表示や事例に加え、ロック観測も取り上げています。発生した待ちをどう読むか知りたい運用担当者に役立つ内容です。クエリ実行計画や監視、障害対応も扱います。
yoku0825氏と北川健太郎氏が著者です。tom__bo氏と坂井恵氏も著者に名を連ねます。希望小売価格は税込3,080円。デッドロックの記録やロック観測を実務で学びたい人には、本書を勧めます。
基礎を手で確かめる
『おうちで学べるデータベースのきほん 第2版』は翔泳社刊の紙書籍で、2024年8月発売です。A5判416ページで、ミック氏と木村明治氏が著しています。
複数のコネクションで読み書きし、分離レベルによる見え方を確かめられます。ロックタイムアウトやデッドロックも実習で扱うため、起きる理由や避けたい処理を手を動かしながら学べます。
バックアップとリカバリ、性能、実行計画も扱います。希望小売価格は税込2,640円。トランザクションの基礎を実習から固めたい人には、この本を勧めます。
8.4 LTSの運用視点
『MySQL徹底入門 第5版 MySQL 8.4 LTS対応』は翔泳社刊の第5版で、2025年6月発売です。608ページあり、MySQL 8.4 LTSに対応。初心者から中級者や開発者に向けて、運用作業を幅広く扱います。
STATUSとSHOWに加え、INFORMATION_SCHEMAやPerformance Schema、sysスキーマを使った状態確認を扱います。MySQL Shellの診断ユーティリティやinnotop、Percona Toolkitも掲載されています。
レプリケーションのトラブルシュートやバックアップとリストアも収録。希望小売価格は税込4,620円です。MySQL全体の保守と合わせてデッドロックを学びたい人には、本書を勧めます。
結論
現場でロック待ちやデッドロックを調査するなら、私は『MySQL運用・管理[実践]入門』を勧めます。検出表示や事例、ロック観測がまとまっており、障害時の初動に結び付けられます。
複数接続の動きを試しながら基礎を固める人には『おうちで学べるデータベースのきほん 第2版』。MySQL 8.4 LTSの状態確認や周辺運用まで学ぶ人には『MySQL徹底入門 第5版』を勧めます。
本で仕組みをつかんだら、実環境での記録も始めましょう。エラー番号と対象SQL、ロック待ちと実行計画を同じ時刻で残します。原因を処理の順序で説明できれば、再試行に頼り切らず設計と運用の両面から再発を減らせます。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。
![MySQL運用・管理[実践]入門 ~安全かつ高速にデータを扱う内部構造・動作原理を学ぶ](https://m.media-amazon.com/images/I/51+wlcyvx4L._SL500_.jpg)



