ITパスポート 2011年 秋期 問63
問題文
複数の利用者が同一データベースに同時にアクセスする処理のうち、データの整合性を保つための対策が不要な処理はどれか。
選択肢
ア:オークションの入札処理
イ:オンラインショッピングの申込み処理
ウ:図書情報の検索処理(正解)
エ:列車座席の予約処理
🔒 解説は解答すると表示されます
複数の利用者が同一データベースに同時にアクセスする処理のうち、データの整合性を保つための対策が不要な処理はどれか。【ITパスポート 解説】
正解の理由
- データベース(複数のデータを整理して保存する仕組み)へのアクセスで、特に「データの整合性(データが正しく一貫している状態)」を保つための対策が必要になるのは、複数ユーザが同時にデータを書き換える(変更する)場合です。
- 図書情報の検索処理は、通常「読むだけ(読み取り/read)」の操作です。読み取りだけなら、複数人が同時に行っても元のデータを書き換えないため、整合性を壊す危険が低く、特別な同時実行制御(排他制御=ロック等)は基本的に不要です。
- 一方、入札・申込み・座席予約は在庫や状態を更新する「書き込み(write)」処理なので、同時に行うとデータの矛盾(例:二重販売、上書き)を起こす恐れがあり、対策が必要です。
解法ステップ
- 各選択肢が「読み取り(read)」か「書き込み(write)」かを判別する。
- 読み取り=データを参照するだけ。
- 書き込み=データを変更する(在庫減少、予約状態更新、最高入札の更新など)。
- 書き込みを含む処理は、複数人が同時実行すると矛盾が起きやすい。よって対策が必要と判断する。
- 読み取りだけの処理は基本的に対策不要。したがって選ぶのは読み取りのみの選択肢(図書情報の検索=ウ)。
簡単な覚え方:読むだけならOK、変えるなら要対策。
選択肢別の誤答解説
- ア: オークションの入札処理
- 入札は「現在の最高入札」を更新する書き込み処理です。複数人がほぼ同時に入札すると、どちらの入札を有効にするかの競合が発生します。ロックやトランザクション(処理を一つのまとまりとして扱う仕組み)が必要です。
- イ: オンラインショッピングの申込み処理
- 注文時に在庫を減らすなどの更新が発生します。複数人が同じ商品を同時に購入すると、在庫が負になったり、二重販売が起きる可能性があるため、排他制御や在庫確認の工夫が必要です。
- ウ: 図書情報の検索処理
- 「検索」は通常、データを参照するだけです(書き換えない)。したがって、整合性維持のための特別な同時実行制御は不要です。※ただし次の「よくある誤解」を参照。
- エ: 列車座席の予約処理
- 座席を予約して状態を「空→予約済み」に変えるため、同時に複数人が同じ座席を取ると二重予約が起きます。強い対策が必要です(楽観的ロック、悲観的ロック、トランザクションなど)。
よくある誤解
- 「同時アクセス=必ず対策が必要」ではない
- 読み取りだけの場合は整合性を壊す可能性が低く、常に対策が必要とは限りません。
- 「検索は絶対に対策不要」でもない
- 検索の過程で閲覧数カウントを増やしたり、ログを書き込んだりする場合は書き込みが発生するため対策が必要になります。
- 「ロック(排他制御)は万能」ではない
- ロックは確実ですが、性能低下やデッドロック(お互いが待ち状態になる)といった問題を招くことがあります。用途に応じて楽観的制御(更新時にチェックする)などを使い分けます。
補足コラム:関連する基本概念(簡単に)
- トランザクション(transaction)
- 一連の処理を「全部成功」か「全部失敗」にする仕組み。途中で失敗したら元に戻す。銀行振込などで使われます。
- 排他制御(ロック)
- 同時に複数が同じデータを書き換えないようにする仕組み。悲観的ロック(先にロックしてから操作)と楽観的ロック(最後に競合チェック)があります。
- ACID(データベースの基本特性)
- Atomicity(原子性)、Consistency(整合性)、Isolation(独立性=同時実行時の影響を避ける性質)、Durability(永続性)。今回の問題ではIsolationが関係します。
簡単なイメージコード(競合で在庫が二重に売れてしまう例)
# 非同期待ち合わせ(実際の環境ではスレッド切り替えで競合が起きる)
stock = 1
def buy():
global stock
if stock > 0:
# 読んでから書く間に別の処理が入ると問題になる
stock -= 1
# 2人が同時にbuy()を呼ぶと、stockが-1になる可能性がある
ロックで保護すると解決します(擬似例)。
import threading
lock = threading.Lock()
stock = 1
def buy():
global stock
with lock:
if stock > 0:
stock -= 1
FAQ
Q1. 検索処理でも「読み取り専用」とは限らないのですか?
A1. はい。表示する際にアクセスログを書き込んだり、閲覧数を更新したりすると書き込みになります。問題文の「図書情報の検索処理」は典型的に検索=読み取りと解釈します。
A1. はい。表示する際にアクセスログを書き込んだり、閲覧数を更新したりすると書き込みになります。問題文の「図書情報の検索処理」は典型的に検索=読み取りと解釈します。
Q2. 「入札」「申込み」「予約」はどのように守れば良いですか?
A2. トランザクションやデータベースのロックを使う方法、あるいは楽観的制御(更新時にバージョンチェックして失敗したら再試行)などがよく使われます。用途により使い分けます。
A2. トランザクションやデータベースのロックを使う方法、あるいは楽観的制御(更新時にバージョンチェックして失敗したら再試行)などがよく使われます。用途により使い分けます。
Q3. ロックはシステムを遅くしますか?
A3. 場合によります。排他制御を乱用すると待ち時間が増えます。そこで楽観的制御や細かい粒度のロックで性能と安全性を両立します。
A3. 場合によります。排他制御を乱用すると待ち時間が増えます。そこで楽観的制御や細かい粒度のロックで性能と安全性を両立します。
関連キーワード: 同時実行制御、排他制御、トランザクション、ロック、楽観的ロック、悲観的ロック、整合性、競合状態、レースコンディション

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

