データベースのトランザクション処理に関する次の記述中の a, b に入れる字句の適切な組合せはどれか。 複数のユーザが同時に同じデータを更新しようとしたとき, データの整合性を保つために, そのデータへのアクセスを一時的に制限する仕組みを [ a ] という。 これを実現する一つの方法は, データを更新する前に, そのデータに [ b ] をかけ, 処理が終了するまでほかのユーザからのアクセスを制限することである。
平成23年度 特別試験 ITパスポート試験 問78
この問題の解説と、これまでの解答の記録です。
問 78
不正解ア
a の「経路制御」も b の「デッドロック」も、いずれも設問の説明に当てはまらない二重の誤りである。経路制御 (ルーティング) はネットワーク上でパケットをどの経路で宛先まで届けるかを決める機能であり、ルータが担当する。データベースの同時更新やデータの整合性とは関係がない。デッドロックは、複数のトランザクションが互いに相手の保持するロックの解放を待ち合ったまま、どちらも処理を進められなくなる異常状態のことであり、排他制御を実現する手段ではなく、むしろ排他制御を行った結果として起こりうる好ましくない現象である。「データにかける」対象にもならない。
不正解イ
b の「ロック」は正しいが、a の「経路制御」が誤りである。経路制御はネットワーク層でパケットの転送経路を選択する機能であって、データベースで同時アクセスを制限する仕組みの名称ではない。設問の空欄 a は「データの整合性を保つためにアクセスを一時的に制限する仕組み」の総称を問うており、そこに入るのは排他制御である。組合せ問題では片方が正しくても、もう片方が誤っていれば選択肢全体が不正解になる点に注意したい。
不正解ウ
a の「排他制御」は正しいが、b の「デッドロック」が誤りである。デッドロックは、例えばトランザクション1がデータ X をロックしたまま Y のロックを待ち、同時にトランザクション2が Y をロックしたまま X のロックを待つ、といった待ち合わせの循環によって双方が永久に停止してしまう状態を指す。これは避けるべき障害であり、更新前に意図的に「かける」ものではない。空欄 b が求めているのは排他制御を実現する具体的な手段であり、そこに入るのはロックである。
- エ
正解 正解はエ (a=排他制御、b=ロック)。空欄 a に入るのは排他制御である。複数のユーザ (トランザクション) が同時に同じデータを更新しようとすると、一方の更新結果がもう一方の更新で上書きされて消えてしまう「更新の喪失 (ロストアップデート)」などが起こり、データの整合性が壊れる。これを防ぐために、あるトランザクションが対象データを扱っている間は、ほかのトランザクションからそのデータへのアクセスを一時的に制限する仕組みが排他制御である。設問文の「データの整合性を保つために、そのデータへのアクセスを一時的に制限する仕組み」という説明は、この排他制御の定義とそのまま対応する。空欄 b に入るのはロックである。排他制御を実現する代表的な方法が、更新の前に対象のデータ (表、行、ページなど) に鍵をかけて占有し、コミットなどで処理が終了した時点で解除するロック方式である。ロック中はほかのユーザからのアクセスが待たされるため、設問文の「データを更新する前に、そのデータにかけ、処理が終了するまでほかのユーザからのアクセスを制限する」という記述と一致する。よって a=排他制御、b=ロック の組合せであるエが正解となる。なお、ロックには更新用に独占する専有ロック (排他ロック) と、参照だけなら複数のトランザクションで同時に取得できる共有ロックがあり、両者を使い分けることで整合性を保ちながら同時実行性を高めている。
- 排他制御とロック — 複数のトランザクションが同じデータを同時に更新しても整合性が壊れないよう、アクセスを一時的に制限する仕組みが排他制御。その代表的な実現方法が、更新前に対象データを占有し処理終了時に解除するロックである。ロックには参照用に同時取得できる共有ロックと、更新用に独占する専有ロック (排他ロック) がある。
- デッドロックは手段ではなく異常状態 — 複数のトランザクションが互いに相手の保持するロックの解放を待ち合い、どちらも進めなくなる状態がデッドロック。ロックを使った排他制御の副作用として発生しうる問題であり、排他制御を実現する手段そのものではない。また「経路制御」はネットワークでパケットの経路を決める機能で、データベースの分野の用語ではない点も区別しておきたい。