Instiq
第4章 · トランザクションと同時実行制御·v1.0.0·更新 2026/7/10·読了目安 約16分

変更要約: 初版

4.2同時実行制御とロック

この節の要点

共有ロック(Sロック)専有ロック(Xロック)によるロック粒度の選択、そして直列化可能性を保証する2相ロックプロトコル(2PL)伸長相縮退相を学び、スループットと整合性のトレードオフから最適な同時実行制御方式を選ぶ判断力を養います。

複数の業務処理が同じ在庫テーブルや口座テーブルに同時にアクセスするシステムを設計するDBAにとって、「どの粒度で・どの種類のロックをかけるか」は、データ整合性とスループットを両立させる中心的な判断です。ロックを粗く・長く取れば整合性は堅牢になりますが同時実行性は下がり、細かく・短く取ればスループットは上がりますが整合性を損なうリスクが増します。この節では、同時実行制御の方式をどう設計すべきかを判断する視点を養います。

4.2.1共有ロックと専有ロック

  • 共有ロック(Sロック)=読み取り(SELECT)の際に取得するロックで、同じ資源に対し複数のトランザクションが同時にSロックを保持できる(読み取り同士は競合しない)。専有ロック(Xロック)=書き込み(UPDATE/INSERT/DELETE)の際に取得するロックで、他のいかなるロック(S/Xとも)とも同時に保持できない(排他的)。ある資源にXロックが掛かっていれば、他のトランザクションはSロックもXロックも取得できず待たされる。
  • ロック粒度=ロックをかける対象の範囲(行単位・ページ単位・表単位)。行ロックは粒度が細かく同時実行性が高いが、ロックの数が増え管理オーバーヘッドが大きい。表ロックは粒度が粗く管理は軽いが、表全体が対象のため同時実行性は低い。多くのRDBMSは行ロックが競合しそうな更新パターンを検出すると自動的に表ロックへロックエスカレーションする。

4.2.22相ロックプロトコルと直列化可能性

  • 2相ロックプロトコル(2PL)=各トランザクションのロック取得・解放を2つの相に分ける規則。伸長相(Growing Phase)では新たなロックの取得のみ許され解放は行わない。ひとたび1つでもロックを解放すると縮退相(Shrinking Phase)に入り、以後はロックの解放のみ許され新規のロック取得は一切できない——一度縮退相に入ったら伸長相には戻れないのが規則の核心。
  • 2PLに従う全てのトランザクションのスケジュールは直列化可能(複数トランザクションを並行実行した結果が、それらを何らかの順序で1つずつ実行した結果と等価になる)であることが理論的に保証される。ただし2PLだけではデッドロック(次節で詳述)は防げない点に注意——直列化可能性の保証とデッドロックフリーは別の性質である。実務では全ロックをCOMMIT/ROLLBACK時に一括解放する厳格な2相ロック(Strict 2PL)が広く使われ、これにより連鎖的なロールバック(カスケーディングアボート)も防げる。

続きは無料登録で読めます

冒頭を無料で公開中。無料登録でこの節の全文と、第4章以降を含む全参考書・全問題集が読めます。