情報処理試験を勉強していると、「排他制御って結局どういう仕組み?ロックやデッドロックと何がどう関係するの?」と混乱しがちです。
この記事では、排他制御の全体像を日常の例え話と図解で整理し、試験で得点できる状態まで一気に引き上げます。
対象試験と出題頻度
排他制御は、基本情報技術者・応用情報技術者で出題されるテーマです。
データベースの同時実行制御やOSのタスク管理で繰り返し登場しており、共有ロック・専有ロックの可否判断やデッドロックの防止策を正確に答えられるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
排他制御(Exclusive Control)とは、一言で言うと
「複数の処理(トランザクションやタスク)が同じデータや資源に同時アクセスしたとき、データの矛盾を防ぐためにアクセスを制限する仕組み」
のことです。
イメージとしては、「図書館の貸出カウンター」です。
同じ本を2人が同時に借りようとしたら困ります。
図書館では「貸出中」の札を立て、1人目が返却するまで次の人を待たせます。排他制御も同じ発想で、「今このデータは使用中」という目印を付けて他の処理を待たせることで、データの整合性を守ります。
📊 排他制御の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Exclusive Control |
| 適用領域 | データベースの同時実行制御、OSのタスク管理 |
| 代表的な実現手段 | ロック(共有ロック・専有ロック)、セマフォ、ミューテックス |
| 排他制御の失敗で起きる問題 | 更新消失(ロストアップデート)、デッドロック |
解説
データベースでもOSでも、複数の処理が同じ資源に同時アクセスする場面は日常的に発生します。例えばECサイトで在庫が残り1個の商品に2人が同時に注文ボタンを押したら、制御がなければ二重出荷が起きます。
こうした「同時書き換えによるデータの矛盾」を防ぐために排他制御が存在します。
排他制御を実現する3つの手段
排他制御は「考え方・目的」であり、その具体的な実現手段は適用領域によって異なります。
| 手段 | 適用領域 | 概要 |
|---|---|---|
| ロック | データベース(DBMS) | トランザクションがデータに「共有ロック(読込み用)」または「専有ロック(更新用)」をかけてアクセスを制限する |
| セマフォ | OS(タスク管理) | 整数型のカウンター(セマフォ変数)をP操作・V操作で増減し、共有資源へのアクセス数を制御する |
| ミューテックス | OS(タスク管理) | 所有権の概念を持つ二値のロック。獲得したタスク自身のみが解放できる点がセマフォとの違い |
図解:排他制御の全体マップ
排他制御の各概念がどう関係しているかを一枚の図で整理します。
ロックの仕組み:共有と専有
データベースにおける排他制御の中心がロックです。
ロックには2種類あり、組み合わせによって同時アクセスの可否が変わります。
ロック獲得の可否マトリクス
| 新たに共有ロック(S) | 新たに専有ロック(X) | |
|---|---|---|
| 既に共有ロック(S) | ○ | × |
| 既に専有ロック(X) | × | × |
▲ 「読み同士は干渉しないから共存OK」「書き換えが絡むと全部NG」が原則
共有ロック(S)は読込み用のロックで、他の処理からの読込みは許可しつつ書込みだけ拒否します。専有ロック(X)は更新用で、読込みも書込みもすべて拒否します。
この「S + S だけが同時成立する」という原則は、ここだけは確実に押さえてください。
デッドロック:排他制御の副作用
排他制御を導入すると、副作用としてデッドロックが起きる可能性が生まれます。
2つの処理が互いに相手が使っている資源の解放を待ち続け、永久に先に進めなくなる状態です。
デッドロック発生の構図
トランザクションA
トランザクションB
↓ ロック済
互いに待ち
=デッドロック
↓ ロック済
▲ 防止策:資源のロック獲得順序をシステム全体で統一する
もう少し詳しく知りたい方向け:2相ロックとロック粒度
2相ロッキングプロトコルとは、トランザクションの実行を「ロックを獲得していくフェーズ(成長相)」と「ロックを解放していくフェーズ(縮退相)」の2段階に分け、成長相が終わるまでロックを1つも解放しないルールです。これにより直列化可能性(Serializability)が保証されます。ただし、2相ロック自体はデッドロックを防止しません。
ロック粒度とは、ロックをかける単位のことです。テーブル単位(粒度大)にすると管理オーバーヘッドは減りますが同時処理性能は落ち、行単位(粒度小)にすると並行性は上がりますが管理コストが増えます。FE H30秋 午前問29で「ロックの粒度が大きいとロック待ちが増える」趣旨の出題があります。
では、この排他制御が試験でどのように出題されるか見ていきましょう。
💡 排他制御の核心を3行で
・「複数の処理が同じデータに同時アクセスする際の矛盾を防ぐ仕組み」が排他制御
・DB向けには共有ロック(S)と専有ロック(X)、OS向けにはセマフォとミューテックスで実現する
・副作用としてデッドロックが起きうるため、資源のロック順序統一などの対策が必要
試験ではこう出る!
排他制御は、FE・APの午前問題で「排他制御の目的を選べ」「ロック獲得の可否を判断せよ」「デッドロックの防止策を選べ」の3パターンが繰り返し出題されています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H28春 午前 問30 |
複数のトランザクションが同一DBを同時更新する際に論理的矛盾を防ぐ技法を選ぶ。 | ・正解は「排他制御」 ・再編成・正規化・整合性制約がひっかけ |
| SG H30春 午前 問46 |
上記FE H28春 問30と同一構成の問題(流用)。 | ・FEとSGで同じ問題が出回る典型例 ・選択肢の文言もほぼ同一 |
| FE H25春 午前 問30 |
ロック獲得の可否について適切な記述を選ぶ。 | ・「共有ロック中に共有ロック獲得は可能」が正解 ・専有ロック中の共有/専有ロック獲得がひっかけ |
| AP R7秋 午前 問18 |
二つのタスクが共用する資源を排他的に使用するとき、デッドロック発生を防ぐ方法を選ぶ。 | ・「資源の獲得順序を統一する」が正解 ・AP R4秋 午前問16でも同一テーマが出題 |
📝 IPA試験での出題パターン
パターン1:「排他制御の目的を選べ」
FE H28春 問30のように、DB同時更新で矛盾を防ぐ技法として「排他制御」を選ばせる形式。再編成(断片化解消)、正規化(冗長性排除)、整合性制約(主キー制約等)の説明がひっかけとして登場する。
パターン2:「ロック獲得の可否を選べ」
FE H25春 問30のように、4通りの共有/専有ロックの組み合わせを並べ、獲得可能な組み合わせを問う形式。「S + S のみ同時成立」を知っていれば即答できる。
パターン3:「デッドロックの防止策を選べ」
AP R7秋 問18のように、複数タスクが資源を排他利用する場面でデッドロックを防ぐ手段を問う形式。「資源の獲得順序を一方向に統一する」が定番の正解。
試験ではここまででOKです。2相ロックの直列化可能性証明やロック粒度の最適化計算まで問われることは稀なので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. DBMSにおいて、複数のトランザクション処理プログラムが同一データベースを同時に更新する場合、論理的な矛盾を生じさせないために用いる技法はどれでしょうか?
- A. 排他制御
- B. 正規化
- C. 再編成
正解と解説を見る
正解:A
解説:
排他制御は、複数のトランザクションが同一データを同時更新する際に、ロック機構を用いてアクセスを制限し、データの論理的矛盾を防ぐ技法です。FE H28春 午前問30でまさにこの形式で出題されています。
選択肢Bの正規化は、関係データベースの設計段階でデータの冗長性を排除し整合性を高める手法であり、同時更新の制御とは目的が異なります。選択肢Cの再編成は、DBの断片化を解消して物理的な格納効率を改善する運用操作であり、トランザクション間の矛盾防止とは無関係です。
よくある質問(FAQ)
Q. 楽観的ロックと悲観的ロックは試験に出ますか?
IPA試験の午前問題では、悲観的ロック(共有ロック・専有ロック)が中心です。楽観的ロック(バージョン番号やタイムスタンプで更新競合を検出する方式)は、応用情報の午後問題やデータベーススペシャリスト試験で出題されることがあります。FE・APの午前対策に限れば、悲観的ロックの理解で十分です。
Q. 排他制御は「データベース」と「OS」のどちら側の知識として覚えるべきですか?
両方です。IPAのシラバスでは、データベースのトランザクション処理(ロック)とコンピュータシステムのタスク管理(セマフォ・ミューテックス)の両方に排他制御が登場します。FE H28春 問30はDB文脈、AP R7秋 問18はOS文脈で出題されています。「排他制御はDBだけの話」と思い込むと、OSのタスク管理問題を取りこぼすため注意してください。
Q. 実務でデッドロックが発生したらどうなりますか?
多くのDBMS(MySQL、PostgreSQL、Oracleなど)にはデッドロック検知機能が内蔵されています。一定間隔で待ちグラフ(Wait-for Graph)を監視し、循環待ちを検出した時点でコストの低い方のトランザクションを自動的にロールバック(取り消し)して循環を解消します。ロールバックされた側はアプリケーション側でリトライ処理を実装しておく必要があります。
Q. 排他制御とトランザクション管理はどう違いますか?
トランザクション管理は、ACID特性(原子性・一貫性・独立性・永続性)を保証する仕組みの総称です。排他制御はそのうち「独立性(Isolation)」を実現するための具体的な手段にあたります。トランザクション管理にはコミット・ロールバックによる障害回復(原子性・永続性の保証)も含まれますが、排他制御はあくまで「同時アクセスの制限」だけを担います。