同時実行制御 (ロック/デッドロック)

DBの同時実行制御とデッドロック対策を学びます。

複数トランザクションが同時にアクセスする際の制御手法。ロック・デッドロックの理解が必要です。

日野 こむぎ(普段) 日野 こむぎ

同じデータに2人が同時にアクセスしたら、どうなるの?

藤森 さやか 先生(笑顔) 藤森 さやか 先生

そこでロックが登場するの。
リソースを一時的に占有して他からのアクセスを防ぐ仕組みよ。

青木 澪(普段) 青木 澪

ロックには共有ロック (Sロック・読み専用) と排他ロック (Xロック・読み書き) があるの。
同じデータに排他ロックは1つだけしか取れないわ。

桃井 すみれ(普段) 桃井 すみれ

デッドロックって何ですかぁ?

青木 澪(普段) 青木 澪

デッドロックは、トランザクション同士が互いのロック解放を待って永遠に進まない状態。
例えばA→B順でロックする処理と、B→A順でロックする処理が同時に走るとデッドロックが発生するわ。

藤森 さやか 先生(普段) 藤森 さやか 先生

対策には2相ロックや、ロック取得順を統一する設計、デッドロック検出して片方をロールバックする方式などがあるの。

青木 澪(普段) 青木 澪

並行制御方式には楽観的ロックと悲観的ロックも。
前者は競合が少ない場合に効率的ね。

ロック競合とデッドロックを手順で判定する

先に取得済み新しい共有ロック新しい排他ロック
共有ロック取得できる待機する
排他ロック待機する待機する

共有ロック同士はどちらも読取りなので共存できます。排他ロックは書換えを伴うため、他の共有・排他ロックと共存できません。

  1. トランザクションT1が商品Aを排他ロックする。
  2. T2が商品Bを排他ロックする。
  3. T1が商品Bを要求し、T2の解放待ちになる。
  4. T2が商品Aを要求し、T1の解放待ちになる。
  5. T1→T2→T1という待ちの循環ができ、デッドロックと判定できる。
日野 こむぎ(普段) 日野 こむぎ

どっちかが待っていたら、それだけでデッドロック?

青木 澪(普段) 青木 澪

単なるロック待ちは、相手が処理を終えれば進めます。
互いに相手の資源を待つ循環ができているかが判定のポイントです。

桃井 すみれ(普段) 桃井 すみれ

2相ロックを使えば、デッドロックも絶対なくなりますかぁ?

藤森 さやか 先生(笑顔) 藤森 さやか 先生

それも典型的な誤りよ。
2相ロックは直列化可能性を保つ方式だけれど、取得順が逆ならデッドロックは起こり得るわ。
全処理でロック順を統一する、待ちグラフで循環を検出する、タイムアウト後に片方をロールバックする、といった対策を組み合わせるの。

確認クイズ

複数のトランザクションが互いに相手のロック解放を待って永遠に進まない状態を何と呼ぶか。

  1. スラッシング
  2. デッドロック
  3. ロールバック
  4. コンテンション
こたえを見る

正解: 2. デッドロック

デッドロックは、複数のトランザクションが互いのロック解放を待って永久に進めなくなる状態です。検出してロールバックする、ロック順を統一するなどで対処します。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。