情報処理試験を勉強していると、「専有ロックって共有ロックとどう違うの?どっちがどっちか混乱する…」という声をよく聞きます。この記事では、専有ロックの意味と仕組みを日常の例え話で噛み砕き、試験で得点できるレベルまで一気に引き上げます。
対象試験と出題頻度
専有ロックは、基本情報技術者・応用情報技術者で出題されるテーマです。
データベースの同時実行制御において、共有ロックとの組み合わせで「ロック獲得の可否」を正確に判断できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
専有ロック(Exclusive Lock)とは、一言で言うと
「データを更新するときにかけるロックで、他のトランザクションからの読込みも書込みもすべて拒否する方式」
のことです。「排他ロック」「占有ロック」とも呼ばれますが、すべて同じ意味です。
イメージとしては、「工事中の通行止め」です。
道路工事をしている間、車も歩行者も通行禁止になります。工事が終わるまで誰も入れません。
専有ロックもこれと同じで、あるトランザクションがデータを書き換えている間、他のトランザクションはそのデータを読むことも書くこともできません。
📊 専有ロックの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Exclusive Lock |
| 別名 | 排他ロック、占有ロック(IPA過去問では3つの表記が混在する) |
| 用途 | データの更新(UPDATE / DELETE / INSERT)時に獲得する |
| 他トランザクションへの影響 | 読込み・書込みの両方を拒否する |
| 記号 | X(eXclusiveの頭文字) |
解説
データベースでは、複数の利用者が同じテーブルの同じ行を同時に操作する場面が日常的に発生します。
もしロックの仕組みがなければ、ある人が在庫数を書き換えている最中に別の人が古い値を読み取り、二重出荷のような矛盾が起きます。
こうした問題を防ぐ排他制御の仕組みとしてロックが存在し、ロックには「共有ロック(S)」と「専有ロック(X)」の2種類があります。
共有ロックとの違い
2つの違いを端的に整理すると、共有ロックは「読むだけだから、他の人も読んでOK。ただし書き換えはダメ」、専有ロックは「書き換え中だから、読みも書きも全部ダメ」という挙動です。
| 種類 | 記号 | 用途 | 他からの読込み | 他からの書込み |
|---|---|---|---|---|
| 共有ロック | S | 読込み(SELECT) | 許可 | 拒否 |
| 専有ロック | X | 更新(UPDATE等) | 拒否 | 拒否 |
図解:ロック獲得の可否マトリクス
すでにロックがかかっている資源に対して、別のトランザクションが新たにロックを獲得できるかどうかを一覧にします。ここだけは確実に押さえてください。
ロック獲得の可否マトリクス
| 新たに共有ロック(S) | 新たに専有ロック(X) | |
|---|---|---|
| 既に共有ロック(S) | ○ | × |
| 既に専有ロック(X) | × | × |
▲ ○=獲得可能、×=獲得不可(ロック解除待ち)。唯一「S + S」だけが同時成立する
覚え方はシンプルです。
「読み同士は干渉しないから共存OK」「書き換えが絡んだら全部NG」──この原則だけで、4マスすべてを導き出せます。
図解:専有ロック中のアクセス制御の流れ
トランザクションAが専有ロックをかけた状態で、トランザクションBが読込みを要求した場合の時系列を追います。
専有ロック中のアクセス制御(時系列)
① 専有ロック(X)を獲得
② 在庫数を 10→5 に更新
③ コミット → ロック解放
① 共有ロック(S)を要求
② Aが専有ロック中 → 待機
③ Aが解放後 → Sロック獲得 → 読込み
▲ 専有ロック中は読込み要求(共有ロック)もブロックされる
もう少し詳しく知りたい方向け:ロック粒度と2相ロック
ロック粒度とは、ロックをかける範囲のことです。テーブル全体にかけるテーブルロックと、行単位にかける行ロックが代表的です。粒度が大きいほど管理オーバーヘッドは減りますが、同時処理性能は落ちます。AP R1秋 午前問28では「行へのロックが表全体のロックを阻止するか」が問われました。
2相ロッキングプロトコルとは、トランザクションの実行を「ロックを獲得していくフェーズ(成長相)」と「ロックを解放していくフェーズ(縮退相)」の2段階に分け、成長相が終わるまでロックを1つも解放しないルールです。直列化可能性を保証しますが、デッドロックの防止にはなりません。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 専有ロックの核心を3行で
・データ更新時にかけるロックで、他トランザクションの読み書きをすべて遮断する
・共有ロック(S)同士だけが唯一同時成立できる。専有ロック(X)が絡むと全部NG
・「読み同士はOK、書き換えが絡んだら全部NG」で4マスすべて導出可能
試験ではこう出る!
専有ロックは、FE・APの午前問題で「ロック獲得の可否を判断する」形式が繰り返し出題されています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H25春 午前 問30 |
排他制御のロック獲得の可否を選ぶ問題。 | ・「共有ロック中に共有ロック獲得は可能」が正解 ・専有ロック中の共有/専有ロック獲得がひっかけ |
| AP H25春 午前 問31 |
ロックの動作に関する記述を選ぶ問題(FE H25春と同一構成)。 | ・FEとAPで同じ問題が流用される典型例 ・選択肢の文言もほぼ同一 |
| FE H25秋 午前 問32 |
3つのトランザクションのロック種別表から、同時起動時の資源待ちの有無を判断する問題。 | ・共有/専有の可否マトリクスを実際に適用して判定する応用問題 ・SとXの衝突判定を時系列で追跡する力が必要 |
| AP R1秋 午前 問28 |
RDBMSのロックに関する記述のうち適切なものを選ぶ問題。 | ・行ロックと表ロックの範囲関係が論点 ・「行aの共有ロック中に表A全体の専有ロックは不可」が正解 |
📝 IPA試験での出題パターン
パターン1:「ロック獲得の可否を選べ」
共有/専有×共有/専有の4通りの組み合わせが選択肢に並び、正しい記述を1つ選ぶ形式。正解は毎回「共有ロック中の資源に別の共有ロックは獲得可能」の選択肢です。FE H25春 問30、FE H26秋 問30、AP H25春 問31で繰り返し出題されています。
パターン2:「ロック競合の有無を判断せよ」
複数のトランザクションが各資源にかけるロック種別が表で示され、同時起動時に待ちが発生するかを判定する形式。FE H25秋 問32が典型。前述のマトリクスを当てはめるだけで解けます。
試験ではここまででOKです。ロック粒度の最適化やMVCC(多版同時実行制御)の詳細まで問われることは稀なので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. トランザクションの同時実行制御に用いられるロックの動作に関する記述のうち、最も適切なものはどれでしょうか?
- A. 共有ロック獲得済の資源に対して、別のトランザクションからの新たな共有ロックの獲得を認める。
- B. 専有ロック獲得済の資源に対して、別のトランザクションからの新たな共有ロックの獲得を認める。
- C. 共有ロック獲得済の資源に対して、別のトランザクションからの新たな専有ロックの獲得を認める。
正解と解説を見る
正解:A
解説:
共有ロックは読込み用のロックであり、他のトランザクションからの読込み(=共有ロックの追加獲得)は許可されます。唯一「共有ロック同士」の組み合わせだけが同時成立する点が判断基準です。
選択肢Bは不正解です。専有ロック獲得中の資源に対しては、読込み・更新いずれのロックも獲得できません。選択肢Cも不正解です。共有ロック中に専有ロックを許可すると、読込み途中のデータが別トランザクションに書き換えられ、整合性を保てなくなります。
よくある質問(FAQ)
Q. 「専有ロック」「排他ロック」「占有ロック」は試験でどの表記が使われますか?
IPA過去問では3つすべてが使われています。FE H25春 問30やAP H25春 問31では「専有ロック」、AP H30秋 問30では「排他ロック」と表記されています。英語はいずれもExclusive Lockであり、意味は完全に同一です。問題文の表記に惑わされず、「更新時にかけるロックで、他の読み書きをすべて拒否するもの」と判断すれば正答できます。
Q. 実務ではどのSQL文で専有ロックがかかりますか?
UPDATE文、DELETE文、INSERT文を実行すると、対象行に自動的に専有ロックがかかります。また、SELECT … FOR UPDATEを使うと、SELECT時点で明示的に専有ロックを獲得できます。これは「このあと更新するつもりだから、先にロックだけ確保しておく」という用途で使われ、ECサイトの在庫引当処理などで頻繁に利用されます。
Q. 専有ロックが長時間解放されないとどうなりますか?
他のトランザクションがそのデータにアクセスできない「ロック待ち」の状態が続きます。これが複数の資源で交差すると、互いにロック解放を待ち続けるデッドロックに発展します。実務ではトランザクションの処理時間を短く保つこと、不要なロックを早期に解放することが基本対策です。
Q. 楽観的ロックと専有ロック(悲観的ロック)はどう使い分けますか?
同時更新の競合が多い場面では、データアクセス前にロックを獲得する悲観的ロック(専有ロック)が適しています。一方、競合が少ない場面ではロックをかけずに処理を進め、更新時にバージョン番号で競合を検出する楽観的ロックの方がスループットが向上します。IPA試験の範囲では悲観的ロックの理解が求められますが、用語として両者の存在を知っておくと安心です。