FE EXAM

共有ロック(読み取りロック)

他からの読取りは許すが書込みを禁じる読取り用のロック。

INTERACTIVE VISUALIZATION
共有(S)
専有(X)
待ち
フェーズ
idle
データのロック
なし
共有ロック保持数
0
シナリオ
ステップ1 / 6
STEP 1/6開始前 — 読み取り用のロック共有ロック(読み取り用ロックとも呼ぶ)は「読むだけなら何人でも同時に使ってよい」というロックです。T1(=トランザクション1)とT2が、同じ商品の在庫数というデータを読みたい状況から始めます。
トランザクションT1待機中T2待機中共有データ在庫数120
解説

📌
共有ロックとは

T1読T2読共有ロック読み取りは同時にOK

共有ロック(読み取りロック、S(Shared)ロック)とは、他からの読み取りは許すが、書き込みは禁止する読み取り専用のロックのことです。複数のトランザクションが同じデータに同時に共有ロックをかけられます。

身近な例で考えると、図書館で1冊の本を複数人がのぞき込んで読むのに似ています。読むだけなら大勢で同時に見ても問題ありません。ただし誰かが「ページを書き換えたい(更新したい)」と言い出したら、読んでいる人がいる間は書き換えられません。

上のツールで▶ボタンを押すと、T1とT2が両方とも共有ロック(S)を取って同時に読み取り、書き込み要求は待たされる様子を確認できます。

👀
読み取り並行の仕組み

SSS+S = 共存OKSXS+X = 待ち

共有ロックが「読み取りを並行できる」のは、読むだけならデータの中身を変えないので、何人で同時に読んでも結果が変わらないからです。みんなが同じ正しい値を見られます。

ロックが「両立できるか」は次のルールで決まります。
共有ロック(S)+ 共有ロック(S):両立できる(同時に読める)
共有ロック(S)+ 専有ロック(X):両立できない(書き込みは待つ)
専有ロック(X)+ 何か:両立できない(書き込み中は誰も触れない)

この「両立できる組み合わせ」を整理した表をロックの両立性(適合性)と呼びます。読み取り同士だけが両立する、と覚えておけば十分です。

⚖️
専有ロックとの違い

ロックには共有ロックのほかに専有ロック(書き込み用、X(eXclusive)ロック)があります。専有ロックは書き込みのためのもので、ほかの読み取りも書き込みもすべて禁止します。

項目共有ロック(S)専有ロック(X)
用途読み取り書き込み(更新)
同時に複数取れる取れる(共存OK)取れない(1つだけ)
他の操作の許可読み取りは許す読み取りも書き込みも禁止

ひとことで言えば、共有ロックは「みんなで読める」、専有ロックは「ひとりだけ書ける」という違いです。読むだけの処理は共有ロックで並行させ、更新する処理は専有ロックで独占させることで、安全さと処理効率を両立させています。

🗂️
ロックの相性表

共有(S)専有(X)共有(S)専有(X)○ 両立✕ 待ち✕ 待ち✕ 待ち行 = すでに掛かっているロック / 列 = 新たに掛けようとするロック

「あるロックとあるロックが同時に取れるか」を一覧にした表をロックの相性表(適合性マトリクス)といいます。表の見方は次のとおりです。
共有(S) × 共有(S):両立できる。複数のトランザクションが同時に読み取れる。
共有(S) × 専有(X):両立できない。誰かが読んでいる間は書き込みを待つ。
専有(X) × 共有(S):両立できない。書き込み中は読み取りも待つ。
専有(X) × 専有(X):両立できない。書き込みは同時に1つだけ。

結論を一言にまとめると、「読み取り同士(S+S)だけが両立し、書き込みが絡むと必ず待たされる」というルールです。なぜこのルールが必要かというと、書き込み中に他から触られると中途半端な値が広まってデータが壊れるからです。読むだけなら値は変わらないので何人いても構いません。

🔄
デッドロックが起きる仕組み

T1T2データAデータBT1もT2も互いを待ち続けて永久に止まる

デッドロック(=死の膠着)とは、複数のトランザクションが互いに相手のロック解放を待ち続けて、永久に先へ進めなくなった状態です。共有ロックを使っていても引き起こされる可能性があります。

典型的なシナリオは次のとおりです。
・T1がデータAに共有ロック(S)を取得し、次にデータBへの書き込みを試みる。
・T2がデータBに共有ロック(S)を取得し、次にデータAへの書き込みを試みる。
・T1はデータBのSロックが外れるまで待つ。T2はデータAのSロックが外れるまで待つ。
・お互いが相手の解放を待っているため、どちらも永久に動けなくなる。

身近な例で考えると、狭い一本道で対向車が来て、お互いが「相手が引いてくれるまで待つ」と言い張っている状態に似ています。デッドロックが起きると、DBMSがどちらかを強制的にキャンセルして解消します。

練習問題

🎯
基本情報技術者 練習問題

Q1.共有ロックの説明として最も適切なものはどれか。
A.他からの読み取りも書き込みもすべて禁止するロック
B.他からの読み取りは許すが、書き込みは禁止する読み取り用のロック
C.1つのトランザクションだけが書き込めるようにするロック
D.データを暗号化して保存するためのロック
Q2.同じデータに共有ロックが掛かっているときの動作として正しいものはどれか。
A.別のトランザクションも共有ロックを取って同時に読める
B.別のトランザクションは読み取りすらできない
C.データが自動的に削除される
D.別のトランザクションがすぐに書き込める
Q3.共有ロックが掛かっているデータに対する書き込み要求の動作として正しいものはどれか。
A.読み取り中でもすぐに書き込める
B.共有ロックを持つトランザクションがすべて解放するまで待たされる
C.書き込みが優先され、読み取りが中断される
D.書き込み要求は無視される

関連コンテンツ