【はいたせいぎょ】

排他制御 とは?

💡 同時アクセスによるデータの「ぐちゃぐちゃ」を防ぐ同期制御の仕組み
📌 このページのポイント
排他制御(Exclusive Control) 時間 ↓ t1 t2 t3 t4 t5 トランザクション A トランザクション B データ READ + LOCK 🔒 在庫: 10 READ 要求 🔒 ロック中 待機中... UPDATE → 在庫: 8 COMMIT + UNLOCK 🔓 在庫: 8 READ 成功(在庫: 8) ロックなしの場合 同時更新 → 不整合 (ロストアップデート) ロックありの場合 順番に処理 → 整合 (データの一貫性) 排他制御により、同時アクセスでもデータの整合性を保つことができる
排他制御の仕組み
ひよこ ひよこ

排他制御って何のためにあるの?

ペンギン先生 ペンギン先生

例えばチケット残り1枚に対して2人が同時に購入を試みた場合、排他制御なしだと両方が「残り1枚あり」を確認して両方が購入完了してしまう(二重販売)。排他制御でそのデータを「1人が使っている間は他をロック」することで防げる。

ひよこ ひよこ

デッドロックって何?

ペンギン先生 ペンギン先生

2つのトランザクションが互いに相手のロック解放を待って止まる状態。AがテーブルXをロックしてYを待ち、BがテーブルYをロックしてXを待つと永遠に進まない。DBが自動検知してどちらかをロールバックして解消することが多い。

ひよこ ひよこ

楽観的ロックってどういうもの?

ペンギン先生 ペンギン先生

「競合はめったに起きない」と楽観的に考えて、読み込み時はロックせず更新時だけ「読み込んだ後に他が変更していないか」チェックする方式。バージョン番号カラムを使い「自分が読んだときのバージョンと今が同じか」確認して競合を検知する。

ひよこ ひよこ

アプリケーションレベルでの排他制御ってどうやるの?

ペンギン先生 ペンギン先生

Webアプリでよくあるのがファイルの同時編集問題。GoogleドキュメントのようなリアルタイムコラボはOT(Operational Transformation)やCRDT(Conflict-free Replicated Data Type)という技術を使って、ロックせずに整合性を保っているんだ。

ひよこ ひよこ

悲観的ロック楽観的ロックってどう使い分けるの?

ペンギン先生 ペンギン先生

競合が頻繁に起きる場面では悲観的ロック(先にロックを取得してから処理)、めったに競合しない場面では楽観的ロック(処理後にバージョンチェック)が向いている。ECサイトの在庫管理は競合が多いから悲観的ロック、社内の設定変更画面は楽観的ロックが適切。間違った方を選ぶとパフォーマンス低下やデッドロックの温床になるから、アクセスパターンをよく分析することが大事だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
排他制御って出てきたら「複数の同時アクセスでデータが壊れないよう制御する仕組み、ロックで同時更新を防ぐ」と思えばOK!
📖 おまけ:英語の意味
「Exclusive Control(Locking)」 = 排他的制御・独占的な制御
💬 「exclusive(排他的・独占的)」なアクセスを制御する。1つのプロセスがデータを使っている間は他を「排除(exclude)」するイメージ
← 用語集にもどる