排他制御(exclusive control)
- テクノロジ系
- データベース
- 基本情報
- 応用情報
- 重要度 ★★★★☆
同じデータを複数の処理が同時に書き換えないよう、一方を待たせる仕組み。
もう少し詳しい説明
排他制御は、同じデータを複数の処理が同時に書き換えて、おかしなことにならないようにする仕組みです。
チケットが残り1枚しかないのに、2人が同時に「買う」を押したとします。どちらの画面にも「残り1枚」と出ているので、両方とも買えてしまうと1枚しかないチケットが2枚売れたことになります。
これを防ぐために、先に手をつけた人が終わるまで、後から来た人には待ってもらいます。この「待たせる」のが排他制御です。
読むだけなら同時でよい
ここが大事なところで、全部を待たせる必要はありません。
残り枚数を「見るだけ」なら、何人が同時に見ても矛盾は起きません。困るのは書き換えるときだけです。そこでロックを2種類に分けます。
| ロック | かける場面 | 他の人は |
|---|---|---|
| 共有ロック(読取り) | データを読むとき | 読むのは同時にできる。書くのは待つ |
| 専有ロック(更新) | データを書き換えるとき | 読むのも書くのも待つ |
覚え方は簡単で、「読み×読み」だけが同時に許される。それ以外の組み合わせはすべて待ちです。試験ではこの組み合わせを表で問われますが、この一言を覚えていれば表は作り直せます。
2つの考え方
ロックのかけ方には、正反対の前提に立つ2つの方式があります。
悲観ロックは「ぶつかるのが普通」という前提です。データを読んだ時点でロックをかけ、他の人を待たせます。確実ですが、同時に使う人が増えると待ちだらけになります。
楽観ロックは「ぶつかることは滅多にない」という前提です。ロックをかけずに進み、更新する直前に「読んだときから変わっていないか」を確認します。変わっていたらやり直し。待ちは出ませんが、ぶつかるとやり直しが増えます。
同時に使う人が多いシステムでは、この2つのどちらを選ぶかが性能を左右します。
どの範囲をロックするか
ロックをかける範囲(粒度)にも選択肢があります。
表ぜんぶをロックすれば確実に安全ですが、関係ない行を触りたい人まで待たされます。行ごとにロックすれば同時に動ける人は増えますが、ロックそのものの管理に手間がかかります。安全さと速さの折り合いをどこで付けるか、という判断です。
なお、複数のロックを取り合った結果、互いに待ち合って動かなくなることがあります。これがデッドロックです。
試験ではこう出る
科目A(旧・午前)では「共有ロックと専有ロックの組合せで、待たされるのはどれか」という表形式の問題が定番です。デッドロックとセットで問われることも多く、両方の違いを説明できる状態にしておく必要があります。応用情報の科目Bでは、同時実行数が増えたときの性能問題として登場します。 表を丸ごと暗記する必要はありません。「読み×読み」だけが共存できる、と覚えておけば組み立て直せます。
関連する用語
- デッドロック
- 鍵を取り合った結果、互いに待ち合って動けなくなる状態。排他制御そのものではない
- セマフォ
- 同時に使える数をOSが管理する仕組み。データベースのロックより広い場面で使う
- トランザクション
- これ以上分けられない処理のまとまり。排他制御はその中で使われる
ミニクイズ
共有ロック(読取りロック)と専有ロック(更新ロック)の関係として正しいものはどれか。
正解は 4番:共有ロック同士は同時にかけられるが、専有ロックは他のどのロックとも共存できない
読むだけなら何人が同時に見ても矛盾しないので共有ロックは共存できます。一方、更新する側は他の誰にも触らせてはいけないため、専有ロックは共有ロックとも他の専有ロックとも共存できません。
最終更新:2026-09-14