頻出高 ⏱ 7分★★★★★

ロックの基本

S/Xロック・粒度・2PL・楽観的ロックを完全網羅

複数のトランザクションが同じデータに同時アクセスするときに更新の競合を防ぐ排他制御の仕組み。データの整合性を保ちながら並行性を管理する。

ロックの種類と両立関係
種類別名取得操作S と両立X と両立
S ロック(共有)読み取りロックSELECT ... FOR SHARE✅ 可❌ 不可
X ロック(排他)書き込みロックUPDATE/DELETE/SELECT FOR UPDATE❌ 不可❌ 不可
読み取りは複数同時 OK(S-S は両立)。書き込みは独占(X は何とも非両立)。
粒度と並行性・オーバーヘッドのトレードオフ
粒度並行性ロック管理コスト用途
データベースロック最低最低メンテナンス・バックアップ
テーブルロック大量バッチ処理(DDL 等)
ページロック-
行ロック(行レベル)OLTP(通常の業務処理)
行ロックは並行性が最も高いが、大量の行にロックをかける場合は「ロックエスカレーション」でテーブルロックに昇格することがある。

テーブルロックと行ロックの両立チェックを効率化するために使われる階層的なロック。下位(行・ページ)にロックをかける前に上位(テーブル)にインテンションロックを取得する。

インテンションロックの種類
種類意味
IS(インテンション共有)下位レベルで S ロックを取得する意向
IX(インテンション排他)下位レベルで X ロックを取得する意向
SIX(共有+IX)テーブル全体に S + 一部行に X の意向
拡張フェーズ:必要なロックを獲得する(解放なし)
↓ ロックポイント(最大保持数)
縮退フェーズ:ロックを順次解放する(新規獲得なし)
2PL を守ることで直列化可能スケジュールを保証できる。ただしデッドロックは防げない。
競合の起きやすさで使い分ける
方式ロック取得タイミング向いている場面
悲観的ロック(Pessimistic)アクセス時に SELECT FOR UPDATE でロック取得競合が頻繁・短時間処理
楽観的ロック(Optimistic)ロックなし・コミット時にバージョン番号で衝突確認競合が少ない・長時間処理
-- 楽観的ロックの例(バージョン番号チェック)
UPDATE 商品
SET    在庫 = 在庫 - 1,
       バージョン = バージョン + 1
WHERE  商品ID = 'P01'
  AND  バージョン = 5;  -- 取得時と同じ値なら更新成功
-- 0 行更新なら他者が先に更新 → アプリ側でリトライ

📝 理解度チェック

S ロックと X ロックの両立関係として正しいのはどれか?
2 相ロッキングプロトコル(2PL)が保証するのはどれか?
楽観的ロックで衝突を検知する方法はどれか?

読了ボタンを押すとトップページの進捗に反映されます