データベース操作・制御

ロック(排他制御) ろっく(はいたせいぎょ)

排他ロック共有ロックトランザクション同時実行制御デッドロック悲観ロック
ロック(排他制御)について教えて

簡単に言うとこんな感じ!

ロックは「使用中の札を立てる」仕組みだよ! トイレの鍵みたいなもので、誰かがデータを更新してる間は他の人が同時に触れないようにする。2人が同じ在庫を同時に「最後の1個を買う!」できないように守るんだ!


ロック(排他制御)とは

ロック(Lock)とは、複数のトランザクションが同じデータに同時アクセスする際に、不整合が生じないよう「一方が処理している間は他方のアクセスを制限する」仕組みです。排他制御とも呼ばれます。

ECサイトで「在庫1個の商品にAさんとBさんが同時に注文ボタンを押した」ケースを考えます。ロックなしでは両方のトランザクションが「在庫あり」を確認して購入処理を進め、在庫が−1になる可能性があります。ロックがあれば、先にアクセスしたAさんの処理が完了するまでBさんのトランザクションは待機し、その後正確な在庫数で判定できます。

ロックは主に「排他ロック(Exclusive Lock)」と「共有ロック(Shared Lock)」の2種類があり、操作の内容によって自動的に使い分けられます。


ロックの種類と互換性

ロック種別別称使用場面他の読み取りを許可他の書き込みを許可
共有ロックS ロック / 読み取りロックSELECT(読み取り)時×
排他ロックX ロック / 書き込みロックUPDATE / DELETE / INSERT 時××
更新ロックU ロック更新前の読み取り時(SQL Server等)×
ロックの互換性マトリクス 要求するロック → 共有ロック(S) 排他ロック(X) 保持中: 共有(S) 排他(X) ✓ 互換 ✗ 待機 ✗ 待機 ✗ 待機 共有ロック同士は共存できる(複数人が同時に読むのはOK)

ロックの粒度

粒度対象同時実行性オーバーヘッド
テーブルロックテーブル全体低い小さい
ページロック物理ページ単位中程度中程度
行ロック(行レベルロック)特定の行のみ高い大きい

歴史と背景

  • 1970年代:DBMSの多ユーザー対応が本格化し、排他制御の必要性が認識される
  • 1976年:IBMのグレイらが「Granularity of Locks and Degrees of Consistency in a Shared Data Base」論文でロック粒度の理論を体系化
  • 1980年代:商用RDBMSが行レベルロックを実装。テーブルロックから行ロックへの移行で同時実行性が大幅改善
  • 1990年代〜MVCCの普及により「読み取りにロックを使わない」アーキテクチャが広まる
  • 現在:PostgreSQL・Oracle・MySQL InnoDBは行レベルロックとMVCCを組み合わせて高い同時実行性を実現

関連する規格・RFC

規格内容
ISO/IEC 9075SELECT … FOR UPDATE / FOR SHARE によるロック取得構文を規定
2PL(2フェーズロッキング)ロック取得フェーズと解放フェーズを分けることでシリアル化可能性を保証するプロトコル

関連用語