情報セキュリティマネジメント 2019年 春期 午前(科目A) 問45
問題文
トランザクションが更新中のデータを、トランザクションが参照しようとしたとき、更新と参照の処理結果を矛盾させないようにするためのDBMSの機能はどれか。
選択肢
ア:最適化
イ:参照制約
ウ:排他制御(正解)
エ:副問合せ
🔒 解説は解答すると表示されます
排他制御【情報セキュリティマネジメント解説】
正解の理由
複数の処理(トランザクション)が同時に同じデータにアクセスすると、更新と参照の順序次第で矛盾した結果(例:未確定の更新を読み取る「ダーティリード」や、更新が上書きされる「ロスト更新」)が生じます。これを防ぐ仕組みが排他制御です。DBMS(Database Management System:データベース管理システム)が用いるロックなどの手法で、同時実行を制御して一貫性を保ちます。したがって、選択肢の中ではウ(排他制御)が該当します。
※用語補足:トランザクションは「一連の処理をまとめて成功か失敗かで扱う単位」、DBMSは「データを管理する専用のソフト」です。
解法ステップ
- 問題の焦点を確認:同時に更新と参照が起きたときの「矛盾を防ぐ」機能を問うている。つまり同時実行制御(Concurrency control)が関係する問題だと判断する。
- 各選択肢の意味を簡単に置き換える:
- ア 最適化:処理の高速化(正解と無関係)
- イ 参照制約:参照整合性(外部キーなど、関係の整合性)
- ウ 排他制御:同時アクセスの制御(ロックなど、今回の目的に合致)
- エ 副問合せ:クエリの書き方(同時実行とは無関係)
- 同時実行に直接関係するものを選ぶ → ウ。
選択肢別の誤答解説
- ア: 最適化
クエリ最適化は処理を速くするための仕組みです。並行性の制御(更新と参照の整合性)を直接保証するものではありません。 - イ: 参照制約
参照制約(外部キー制約など)はテーブル間の関係の整合性(例:存在しない社員IDで注文を作れない)を保ちます。並行して更新・参照される際の読み取り一貫性とは目的が違います。 - ウ: 排他制御(正解)
ロックなどで同時アクセスを制御し、読み込みと書き込みの競合でデータが矛盾しないようにします。 - エ: 副問合せ
副問合せはクエリ内部にさらに問い合わせを入れる技法で、同時実行の問題を解決する仕組みではありません。
よくある誤解
- 「参照制約があればデータの不整合は起きない」
参照制約は表間の関係を保つが、同時処理による一時的な矛盾(ダーティリード等)は排他制御で防ぐ必要があります。 - 「排他制御=常にテーブル全体をロックする」
実際は行単位やページ単位、共有(読み取り)と専有(書き込み)など細かい粒度があります。過度なロックは性能低下の原因です。 - 「排他制御さえあれば問題なし」
排他制御は重要ですが、長時間のトランザクションや不適切な設計はデッドロックや性能悪化を招くため、運用上の配慮が必要です。
補足コラム
- ACIDと分離性
トランザクションの性質はACID(Atomicity:原子性、Consistency:一貫性、Isolation:分離性、Durability:永続性)で説明されます。今回の問題はIsolation(分離性)に関わり、排他制御は分離性を実現する主要手段です。 - ロック以外の手法
悲観的ロック(データを確実にロックする)に対し、楽観的ロック(バージョン番号やタイムスタンプで競合を検出して再試行する)もあります。業務では短いトランザクションと楽観的制御の組み合わせが有効なことが多いです。 - 実務での運用イメージ
例:社内システムで伝票を更新する処理は、画面で長時間入力させている間に行ロックを長く保持すると他の処理が止まるため、入力は一時保存し、最終確定時に短時間でトランザクション処理を行う、といった運用が現場では有効です。
SQLの簡単な例(行ロックを行う場合)
BEGIN TRANSACTION;
-- 更新対象の行を排他ロック(DBMSにより構文は異なる)
SELECT * FROM accounts WHERE id = 123 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 123;
COMMIT;
※ SQL(Structured Query Language:問い合わせ言語)。上記は概念例で、DBMSによって構文や挙動が異なります。
FAQ
Q. 「ダーティリード」とは何ですか?
A. 別トランザクションがまだ確定(コミット)していない更新を他のトランザクションが読み取ってしまうことです。後で更新がロールバックされると読み取った値は偽の値になります。
A. 別トランザクションがまだ確定(コミット)していない更新を他のトランザクションが読み取ってしまうことです。後で更新がロールバックされると読み取った値は偽の値になります。
Q. 排他制御で性能が悪くなるときの対策は?
A. トランザクションを短くする、ロックの粒度を細かくする(行ロックなど)、楽観的同時実行制御を検討する、適切な分離レベルを選ぶ、などがあります。
A. トランザクションを短くする、ロックの粒度を細かくする(行ロックなど)、楽観的同時実行制御を検討する、適切な分離レベルを選ぶ、などがあります。
Q. 分離レベルって何を選べばよい?
A. 一般的に業務の整合性要件と性能のバランスで決めます。重要な財務処理なら高い分離性(Serializable)を選び、報告系の参照なら低め(Read Committed等)で性能を優先することがあります。
A. 一般的に業務の整合性要件と性能のバランスで決めます。重要な財務処理なら高い分離性(Serializable)を選び、報告系の参照なら低め(Read Committed等)で性能を優先することがあります。
関連キーワード: トランザクション、排他制御、ロック、同時実行制御、ACID、分離レベル、悲観的ロック、楽観的ロック、参照制約、副問合せ

\ せっかくなら /
情報セキュリティマネジメントを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

