ロック(排他制御) ろっく(はいたせいぎょ)
排他ロック共有ロックトランザクション同時実行制御デッドロック悲観ロック
ロック(排他制御)について教えて
簡単に言うとこんな感じ!
ロックは「使用中の札を立てる」仕組みだよ! トイレの鍵みたいなもので、誰かがデータを更新してる間は他の人が同時に触れないようにする。2人が同じ在庫を同時に「最後の1個を買う!」できないように守るんだ!
ロック(排他制御)とは
ロック(Lock)とは、複数のトランザクションが同じデータに同時アクセスする際に、不整合が生じないよう「一方が処理している間は他方のアクセスを制限する」仕組みです。排他制御とも呼ばれます。
ECサイトで「在庫1個の商品にAさんとBさんが同時に注文ボタンを押した」ケースを考えます。ロックなしでは両方のトランザクションが「在庫あり」を確認して購入処理を進め、在庫が−1になる可能性があります。ロックがあれば、先にアクセスしたAさんの処理が完了するまでBさんのトランザクションは待機し、その後正確な在庫数で判定できます。
ロックは主に「排他ロック(Exclusive Lock)」と「共有ロック(Shared Lock)」の2種類があり、操作の内容によって自動的に使い分けられます。
ロックの種類と互換性
| ロック種別 | 別称 | 使用場面 | 他の読み取りを許可 | 他の書き込みを許可 |
|---|---|---|---|---|
| 共有ロック | S ロック / 読み取りロック | SELECT(読み取り)時 | ○ | × |
| 排他ロック | X ロック / 書き込みロック | UPDATE / DELETE / INSERT 時 | × | × |
| 更新ロック | U ロック | 更新前の読み取り時(SQL Server等) | ○ | × |
ロックの粒度
| 粒度 | 対象 | 同時実行性 | オーバーヘッド |
|---|---|---|---|
| テーブルロック | テーブル全体 | 低い | 小さい |
| ページロック | 物理ページ単位 | 中程度 | 中程度 |
| 行ロック(行レベルロック) | 特定の行のみ | 高い | 大きい |
歴史と背景
- 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 9075 | SELECT … FOR UPDATE / FOR SHARE によるロック取得構文を規定 |
| 2PL(2フェーズロッキング) | ロック取得フェーズと解放フェーズを分けることでシリアル化可能性を保証するプロトコル |