ITパスポート 2009年 秋期 問88
問題文
複数の利用者が同時にデータベースを利用する場合に、1人の利用者がデータ更新中に、同一のデータを別の利用者が参照しようとした。このとき、データの整合性を保障するためのデータベース管理システムでの制御として、適切なものはどれか。
選択肢
ア:更新処理を中断して参照させる。
イ:更新中の最新のデータを参照させる。
ウ:更新中の利用者の処理が終了してから参照させる。(正解)
エ:更新を破棄して更新前のデータを参照させる。
🔒 解説は解答すると表示されます
排他制御【ITパスポート解説】
正解の理由
複数の利用者が同じデータを扱うとき、途中の更新内容(まだ確定していない変更)を別の人が参照すると、整合性が壊れる危険があります。データベースでは「トランザクション(処理のまとまり)」を確実に完了させるために、更新中はその処理が終わる(コミット:確定する、またはロールバック:取り消す)まで他者からのアクセスを制限します。したがって、更新中の利用者の処理が終了してから参照させる選択肢、すなわちウが適切です。これにより「ダーティリード(dirty read:未確定のデータを読んでしまうこと)」や一貫性の破壊を防げます。
(用語補足)
- トランザクション(transaction:一連の処理をまとめて扱う単位)
- コミット(commit:トランザクションの変更を確定すること)
- ロールバック(rollback:トランザクションの変更を取り消すこと)
- ロック(lock:同時アクセスを調整する仕組み)
解法ステップ
- 問題は「同時に参照・更新が起きたときに整合性を守るにはどうするか?」と整理する。
- 整合性を乱す代表的な事象は「未確定の更新を別の利用者が読んでしまう」こと(ダーティリード)や「更新が上書きされて消える」ことなど。
- これらを防ぐには、更新が確定するまで他者のアクセスを制限する仕組み(排他制御=ロック)が必要と判断する。
- 選択肢を当てはめ、更新完了後に参照させるウが最も安全と結論づける。
選択肢別の誤答解説
-
ア: 更新処理を中断して参照させる。
更新を途中で中断すると、処理が不完全な状態でデータが残る可能性があります。業務上の矛盾やトランザクションの原子性(全部成功するか全部失敗するか)が崩れます。中断は適切な整合性対策ではありません。 -
イ: 更新中の最新のデータを参照させる。
これは「ダーティリード(未確定の変更を読むこと)」を許してしまいます。もし更新中の処理が失敗してロールバックされた場合、参照した側は存在しない(確定していない)データに基づいて誤った判断をしてしまいます。 -
ウ: 更新中の利用者の処理が終了してから参照させる。
正答。更新を行うトランザクションがコミットまたはロールバックして結果が確定するまで、他の利用者の参照や更新を制限することで整合性を保ちます。 -
エ: 更新を破棄して更新前のデータを参照させる。
更新内容を勝手に破棄すると、その利用者が行った処理結果が失われます。これは「データの損失」やユーザー操作の否定につながり、適切な同時実行制御ではありません(※「ロストアップデート」とは別の現象で、ここでは単に更新内容を取り消してしまうことを指します)。
よくある誤解
-
「ロックは常に悪いから避けるべき」
ロックは性能に影響を与えることがありますが、データの整合性を守るために必要です。実際は短時間のロックやMVCC(Multi-Version Concurrency Control:多版本同時制御)のような仕組みで性能と整合性の両立を図ります。 -
「読み取りは何をしても安全」
読み取りでも未確定(コミット前)のデータを参照すると誤った判断を招きます。読み取りにも制御が必要な場合があります。 -
「更新が上書きされる=いつも‘ロストアップデート’とは限らない」
「ロストアップデート」は特定の条件(双方が古い値を読み同じ場所を更新し片方の更新が消える)で起きます。単に更新を破棄することや中断することは別の問題です。
補足コラム
-
ロックの種類
- 共有ロック(shared lock):読み取りは複数同時に許すが、書き込みはブロックする。
- 排他ロック(exclusive lock):書き込みを行うときに設定し、他の読み書きをブロックする。
-
MVCC(Multi-Version Concurrency Control:多版本同時制御)
一部のデータベースはデータの古いスナップショット(複数のバージョン)を保持し、読み取り側がロックを取らなくても整合性のある過去の状態を読める方式を採用しています。これにより読み取りと書き込みの競合を減らせます。 -
障害時の振る舞い
更新中に障害が起きた場合、ロールバックして元の整合性のある状態に戻すことが重要です。これもトランザクション制御の一部です。
FAQ
Q: 参照させるまでどれくらい待つのですか?
A: 更新するトランザクションが「コミット」または「ロールバック」するまで待ちます。待ち時間は処理の内容やデータベースの設定によりますが、通常は短くする設計が推奨されます。
A: 更新するトランザクションが「コミット」または「ロールバック」するまで待ちます。待ち時間は処理の内容やデータベースの設定によりますが、通常は短くする設計が推奨されます。
Q: すべてのDBで同じ方法ですか?
A: 基本原則は同じですが、実装は異なります。既定で「Read Committed(コミット済みのみ読む)」を採るDB、MVCCを使うDBなどがあります。
A: 基本原則は同じですが、実装は異なります。既定で「Read Committed(コミット済みのみ読む)」を採るDB、MVCCを使うDBなどがあります。
Q: 開発者として何を気をつければいいですか?
A: 長時間ロックを握り続けない、トランザクションを短く保つ、必要に応じて適切な隔離レベル(isolation level)を選ぶ、を心がけると良いです。
A: 長時間ロックを握り続けない、トランザクションを短く保つ、必要に応じて適切な隔離レベル(isolation level)を選ぶ、を心がけると良いです。
関連キーワード: データベース、排他ロック、共有ロック、トランザクション、コミット、ロールバック、MVCC、ダーティリード、同時実行性、整合性

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

