情報処理試験を勉強していると、「共有ロックと専有ロックって何が違うの?どっちがどっちだっけ?」と混乱しがちです。
この記事では、共有ロックの仕組みを専有ロックとの違いを軸に整理し、試験で確実に得点できる状態まで引き上げます。
対象試験と出題頻度
共有ロックは、基本情報技術者・応用情報技術者で出題されるテーマです。
排他制御の中核を成す概念であり、専有ロック(占有ロック)との可否判断を正確に答えられるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
共有ロック(Shared Lock / Sロック)とは、一言で言うと
「データベースの読込み時にかけるロックで、他のトランザクションからの読込みは許可しつつ、更新(書込み)だけを禁止する仕組み」
のことです。
イメージとしては、「図書館の閲覧席」です。
閲覧席に置かれた参考資料は、複数の利用者が同時に読むことができます。ただし、誰かがページを破ったり書き込んだりするのは禁止されています。
共有ロックも同じで、「読むだけなら何人でもどうぞ、でも書き換えはダメ」というルールを資源にかける仕組みです。
📊 共有ロックの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Shared Lock(Sロック) |
| 対になる概念 | 専有ロック(Exclusive Lock / Xロック)※占有ロックとも呼ばれる |
| 使用タイミング | データの参照(SELECT)時 |
| 他トランザクションへの影響 | 読込み → 許可(共有ロックの重ねがけ可)、更新 → 拒否 |
解説
データベースでは、複数のトランザクションが同じデータに同時アクセスする場面が日常的に発生します。
全員が読むだけなら問題は起きませんが、読み書きが混在すると「読んでいる最中にデータが書き換わる」「2人が同時に更新して片方の変更が消える」といった矛盾が発生します。
この矛盾を防ぐために、DBMSはデータにロックをかけてアクセスを制限します。ロックには「読込み用」と「更新用」の2種類があり、それぞれが共有ロック(S)と専有ロック(X)にあたります。
共有ロックと専有ロックの違い
2種類のロックの性質を正確に区別することが理解の土台になります。
| 項目 | 共有ロック(S) | 専有ロック(X) |
|---|---|---|
| 用途 | データの読込み(SELECT) | データの更新(INSERT / UPDATE / DELETE) |
| 他からの読込み | 許可(Sロック重ねがけ可) | 拒否 |
| 他からの更新 | 拒否 | 拒否 |
ポイントは「共有ロック同士だけが共存できる」という一点です。専有ロックが絡む組み合わせはすべて拒否されます。
図解:ロック獲得の可否マトリクス
先行トランザクションがかけているロックと、後続トランザクションが新たにかけたいロックの組み合わせを整理すると、以下の4パターンになります。
ロック獲得の可否マトリクス
| 後続が共有ロック(S) | 後続が専有ロック(X) | |
| 先行が共有ロック(S) | ⭕ 可 | ❌ 不可 |
| 先行が専有ロック(X) | ❌ 不可 | ❌ 不可 |
▲ 「S + S」だけが同時成立する。これが全ての判断基準になる
図解:共有ロックの動作イメージ
具体的にトランザクションがどう振る舞うかを、時系列で見てみましょう。
✅ ケース1:Sロック中 → 別のSロック要求 → 許可
STEP 1
トランザクション A が商品テーブルに共有ロック(S)をかけて読込み開始
STEP 2
トランザクション B が同じテーブルに共有ロック(S)を要求
結果
⭕ 許可 ― 読込み同士は干渉しないため、S + S は共存できる
❌ ケース2:Sロック中 → Xロック要求 → 待ち
STEP 1
トランザクション A が商品テーブルに共有ロック(S)をかけて読込み開始
STEP 2
トランザクション C が同じテーブルに専有ロック(X)を要求(更新したい)
結果
❌ 待ち(ブロック) ― A が読込み中にデータを書き換えると矛盾が生じるため、A がSロックを解放するまで C は待機
もう少し詳しく知りたい方向け:ロック粒度と2相ロック
ロック粒度とは、ロックをかける単位のことです。テーブル単位(粒度大)にすると管理オーバーヘッドは減りますが、ロック待ちが増えて同時処理性能が低下します。行単位(粒度小)にすると並行性は上がりますが、ロックの管理コストが増加します。
2相ロッキングプロトコルとは、トランザクションの実行を「ロックを獲得するフェーズ(成長相)」と「ロックを解放するフェーズ(縮退相)」の2段階に分け、成長相が終わるまでロックを1つも解放しないルールです。これにより直列化可能性(Serializability)が保証されます。
FE・APの午前問題ではロック粒度の概念が問われることはありますが、2相ロックの数学的な証明まで踏み込まれることはありません。試験範囲では深掘りされない領域です。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 共有ロックの核心を3行で
・読込み時にかけるロックで、他の読込みは許可・更新は拒否
・専有ロック(X)は更新時にかけるロックで、読込みも更新もすべて拒否
・「S + S だけが同時成立する」の一点を覚えれば、ロック可否の判断はすべて解ける
試験ではこう出る!
共有ロックは、FE・APの午前問題で排他制御のロック可否判断問題として繰り返し出題されています。
出題パターンは大きく2つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H20秋 午前 問60 |
排他制御に関する記述として適切なものを選ぶ。 | ・「共有ロック中に共有ロックは可能」が正解 ・S中にX、X中にS、X中にXはすべて不可 |
| AP H25春 午前 問31 |
ロックの動作に関する記述として適切なものを選ぶ。 | ・FE H20秋 問60と同一構成の問題(流用) ・FE H26秋 問30でも再出題 |
| FE H20春 午前 問59 |
2つのジョブを同時起動したときの資源待ちの有無を判断する。 | ・SロックとXロックの可否マトリクスを使った実践的な判断問題 ・H14秋 問68、H25秋 問32でも再出題 |
| FE H18春 午前 問59 |
ロックに関する説明として適切なものを選ぶ。 | ・「読取り時に共有ロック、変更時に占有ロック」が正解 ・デッドロックやロック粒度の記述がひっかけ |
📝 IPA試験での出題パターン
パターン1:「ロック獲得の可否を選べ」
4つのロック組み合わせ(S+S、S+X、X+S、X+X)の記述を並べ、獲得可能なものを選ばせる形式。FE H20秋 問60、AP H25春 問31で繰り返し出題されている。「S + S のみ可」を知っていれば即答できる。
パターン2:「資源待ちの有無を判断せよ」
FE H20春 問59のように、複数ジョブが異なる資源にS/Xロックをかける表が示され、同時起動時にどのジョブが待ち状態になるか判断させる形式。可否マトリクスを表に当てはめて1つずつ確認すれば解ける。
ここだけは確実に押さえてください。「S + S = 可、それ以外 = 不可」の原則さえ身につけば、ロック関連の問題は得点源にできます。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. データベースの排他制御に関する記述のうち、適切なものはどれでしょうか?
- A. あるトランザクションが共有ロックをかけている資源に対して、別のトランザクションから共有ロックをかけることは可能である。
- B. あるトランザクションが専有ロックをかけている資源に対して、別のトランザクションから共有ロックをかけることは可能である。
- C. あるトランザクションが共有ロックをかけている資源に対して、別のトランザクションから専有ロックをかけることは可能である。
正解と解説を見る
正解:A
解説:
共有ロック(Sロック)が既にかかっている資源に対して、別のトランザクションが新たに共有ロックをかけることは認められます。読込み同士は互いに干渉しないためです。FE H20秋 午前問60で同じ構成の問題が出題されています。
選択肢Bは誤りです。専有ロック(Xロック)は読込みも更新もすべて拒否するため、他のトランザクションはいかなるロックもかけられません。選択肢Cも誤りです。共有ロック中の資源に対して専有ロックをかけようとすると、読込み中のデータが書き換わる矛盾が生じるため、先行トランザクションがロックを解放するまで待ち状態になります。
よくある質問(FAQ)
Q. 「共有ロック」と「占有ロック」「専有ロック」「排他ロック」は別物ですか?
名前が違うだけで指しているものは同じです。IPAの過去問では「共有ロック」と「占有ロック」の表記が多く使われますが、「専有ロック」「排他ロック」も同義です。英語では共有ロック=Shared Lock(S)、占有/専有/排他ロック=Exclusive Lock(X)です。問題文でどの表記が使われても、S/Xの性質は変わりません。
Q. 共有ロックとデッドロックはどう関係しますか?
共有ロック単独ではデッドロックは発生しません。デッドロックは、2つ以上のトランザクションが互いに相手の保持する資源のロック解放を待ち合う状態です。典型的には専有ロックが絡む場面で起きます。例えば、トランザクションAが資源1にXロック → 資源2を要求、トランザクションBが資源2にXロック → 資源1を要求、という順序で循環待ちが発生します。
Q. 実務ではSELECT文を実行するだけで自動的に共有ロックがかかりますか?
DBMSやトランザクション分離レベルによって異なります。MySQLのInnoDB(デフォルトのREPEATABLE READ)では通常のSELECTにロックはかからず、MVCC(多版型同時実行制御)によってスナップショット読取りを行います。明示的に共有ロックをかけたい場合は SELECT ... FOR SHARE(MySQL 8.0以降)や SELECT ... LOCK IN SHARE MODE を使います。PostgreSQLも同様にMVCCが基本で、SELECT ... FOR SHARE で明示的に取得します。IPA試験の範囲では「SELECTで共有ロック、UPDATEで専有ロック」の理解で十分です。
Q. 楽観的ロックと悲観的ロックの違いは何ですか?
共有ロック・専有ロックは「悲観的ロック」に分類されます。悲観的ロックは「競合が起きる前提」でアクセス前にロックを取得する方式です。一方、楽観的ロックは「競合はめったに起きない前提」で、更新時にバージョン番号やタイムスタンプを比較し、変更が競合した場合だけエラーにする方式です。FE・APの午前問題では悲観的ロックが中心で、楽観的ロックが出題されるのはデータベーススペシャリスト試験が主です。