ITパスポート 2009年 秋期 問88
問題文
複数の利用者が同時にデータベースを利用する場合に、1人の利用者がデータ更新中に、同一のデータを別の利用者が参照しようとした。このとき、データの整合性を保障するためのデータベース管理システムでの制御として、適切なものはどれか。
選択肢
ア:更新処理を中断して参照させる。
イ:更新中の最新のデータを参照させる。
ウ:更新中の利用者の処理が終了してから参照させる。(正解)
エ:更新を破棄して更新前のデータを参照させる。
🔒 解説は解答すると表示されます
同一データの参照と更新の制御【ITパスポート 解説】
正解の理由
理由を一言で言うと、「データの整合性(正しさ)を守るためには、更新処理が完了(確定)していない中途半端な状態を他の利用者に見せてはいけない」からです。
ここで出てくる重要語を簡単に説明します。
ここで出てくる重要語を簡単に説明します。
- データベース(複数のデータを整理して保存・検索する仕組み)
- トランザクション(処理のまとまり。一連の操作を「全部成功」か「全部失敗」にする単位)
- ロック(あるデータへ同時アクセスを制御する仕組み)
- 整合性(データが矛盾なく正しい状態であること)
更新処理が「完了して確定(コミット)」されるまでは、その更新は正式なものではありません。途中の状態を別利用者が参照すると、矛盾(たとえば計算結果が変になるなど)が生じます。したがって、更新側が処理を終える(=コミットする)まで待ってから参照させるのが正しい制御です。
解法ステップ
- 問題文を確認:複数利用者が同時にデータベースを利用。ある人がデータを更新中に別の人が参照しようとしている。
- 目的を把握:データの整合性(正しさ)を保障する制御を選ぶ。
- 各選択肢を「整合性が保てるか」で判断する:
- 更新途中のデータを見せると中途半端な値(不整合)が出る。
- 更新を中断・破棄すると更新者の意図が無くなり一貫性を損なう。
- 結論:更新処理が終わるまで参照を待たせる(ウ)が最も整合性を守る。
選択肢別の誤答解説
-
ア: 更新処理を中断して参照させる。
更新を途中で中断すると、更新者の処理が不完全なまま終わる可能性があります。トランザクションの一貫性(全部は成功するか全部失敗するか)が崩れます。業務上の計算や在庫数などで誤った状態になります。 -
イ: 更新中の最新のデータを参照させる。
更新がまだ確定していない段階のデータを他者に見せることを「ダーティリード(dirty read)」と呼びます。途中の不完全な値を見せることで、別の処理がそれを根拠に動くと整合性が崩れます。 -
ウ: 更新中の利用者の処理が終了してから参照させる。
(正解)更新が完了して確定された値だけを他者が参照するため、データの一貫性・整合性が保たれます。一般的なデータベース管理システム(DBMS)ではロックやトランザクション制御でこれを実現します。 -
エ: 更新を破棄して更新前のデータを参照させる。
更新を無条件に破棄すると、更新した利用者の意図した変更が消えます。これもデータの一貫性や業務の正当性を損なう可能性があります(いわゆる「ロストアップデート」や意図せぬデータ消失)。
よくある誤解
-
「最新の値を常に見せればよい」
— 最新でも「確定していない」最新は危険です。途中の値は誤った判断を招きます(ダーティリード)。 -
「待たせると性能が落ちるから無視していい」
— 確かに待ち時間は性能に影響しますが、整合性を犠牲にしては業務上の致命的ミスにつながります。性能と整合性はバランスが必要です。 -
「ロックは常に悪い」
— ロック(排他制御)は整合性を守る基本です。必要に応じて楽観的制御(後で検査して競合があればやり直す)など別方式も使われますが、根本は整合性の確保です。
補足コラム
データベースの並行制御には「隔離レベル(アイソレーションレベル)」という設定があります。英語は Isolation Level で、以下のような段階があります(簡単に説明):
- Read Uncommitted(読み取り未確定許可):ダーティリードを許す。性能は良いが危険。
- Read Committed(読み取り確定):コミットされたデータだけ読む。ダーティリードを防ぐ。
- Repeatable Read(反復読み取り可能):同じトランザクション内で何度読んでも同じ結果を保証。
- Serializable(直列化可能):最も厳密で、同時実行が直列実行と同じ結果になる。安全だが性能コスト高。
実務では「Read Committed」や「Repeatable Read」がよく使われます。これらは更新が確定するまで読み取りを制限する考え方に基づいています。
用語メモ:ACID
- Atomicity(原子性):処理は全部成功か全部失敗か。
- Consistency(整合性):データは常に正しい状態へ遷移する。
- Isolation(独立性):同時実行でも互いに影響を受けない。
- Durability(永続性):確定した変更は失われない。
FAQ
Q1. 「待たせる」方法は具体的にどうやって行うのですか?
A1. 多くはロック(排他制御)やトランザクション管理で行います。更新中のデータに書き込みロックをかけ、他の利用者の読み取りを制限します。DBMSにより設定や仕組みは異なります。
A1. 多くはロック(排他制御)やトランザクション管理で行います。更新中のデータに書き込みロックをかけ、他の利用者の読み取りを制限します。DBMSにより設定や仕組みは異なります。
Q2. 全部待たせるとシステムが遅くなりませんか?
A2. 遅くなる場合があります。そこで、必要な場面だけ厳格にし、あまり重要でない読み取りは緩める(楽観的制御や弱い隔離レベル)などの工夫をします。業務の重要度に応じて調整します。
A2. 遅くなる場合があります。そこで、必要な場面だけ厳格にし、あまり重要でない読み取りは緩める(楽観的制御や弱い隔離レベル)などの工夫をします。業務の重要度に応じて調整します。
Q3. 他に安全に同時処理する方法はありますか?
A3. 楽観的並行制御(更新時に競合がなければ確定、競合があればやり直す)や、バージョン管理(各更新にバージョン番号を付ける)などがあります。ただし基本原則は「整合性を守る」ことです。
A3. 楽観的並行制御(更新時に競合がなければ確定、競合があればやり直す)や、バージョン管理(各更新にバージョン番号を付ける)などがあります。ただし基本原則は「整合性を守る」ことです。
関連キーワード: データ整合性、トランザクション、ロック、アイソレーションレベル、ダーティリード、ACID

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

