応用情報技術者 2015年 春期 午後 問08
チケット販売システムの在庫調整機能の開発に関する次の記述を読んで、設問1〜3に答えよ。
C社とD社は、インターネットを用いたチケット販売用Webサイトをそれぞれ運営している。C社、D社のWebサイトは、ともに複数の公演を取り扱い、24時間販売可能である。両社は、イベントの主催者であるV社の委託を受けて、チケットを販売している。
V社は、公演ごとに両社の先行きを予想し、販売開始前にC社、D社にチケット在庫を割り当てる。両社のWebサイトでは、それぞれ自社に割り当てられたチケット在庫だけを販売する。
近年、同じ公演のチケットが、一方のWebサイトでは売切れになっているにもかかわらず、他方のWebサイトではまだ販売されているという状況が多く見られる。そこでV社は、C社とD社に対して、販売開始後に在庫が多いWebサイトから少ないWebサイトへチケット在庫を移動する在庫調整機能の開発を依頼した。
C社、D社は依頼を受けて検討を着手した。C社は開発部門のE氏、D社は開発部門のF氏がそれぞれ設計を担当することになった。
〔V社の要望〕
・在庫調整機能に関するV社の要望は、次のとおりである。
・在庫調整を行うかどうかは、公演ごとに決定し、販売開始後も変更可能とする。
・在庫調整は、利用者のアクセスが少ない時間帯を選び、1日に数回実施できる。
・在庫調整実施中の公演のチケットは、数分程度であれば一時的に販売不可となってもよい。
・公演ごとに、在庫調整を実施するチケット在庫数のしきい値を設定する。しきい値はC社WebサイトとD社Webサイトで同じ値とする。在庫調整を開始する時点でC社Webサイト、D社Webサイトのどちらか一方の販売可能なチケット在庫数がしきい値未満であった場合、チケット在庫を移動する。ただし、販売可能なチケット在庫数が、両方のWebサイトでしきい値以下の場合、チケット在庫の移動は実施しない。
・これらの要望を満たす実現方式の中で、できるだけ費用を掛けずに済む方式を採用したい。
〔V社チケット在庫のデータ項目〕
C社、D社で保持する V社チケット在庫のデータ項目〔抜粋〕を表1に示す。チケット在庫データは、公演の全席分を C社、D社の両社で保持する。データ項目は将来的に V社の意向によって追加される可能性がある。


〔在庫移動処理の検討〕
E 氏と F 氏は、チケット在庫を移動するための処理〔在庫移動処理〕の内容について検討した。しきい値を 50 席とした場合の在庫移動処理の内容を表2に示す。

〔システム処理方式の検討〕
E氏とF氏は、V社の費用面の要望も考慮した結果、D社システムがファイルを送信することによって処理を開始し、ファイルを受信したC社システムが在庫移動処理を実施した後、D社システムへ結果のファイルを送信するという、ファイルを用いた疎結合構成の在庫調整処理を採用することとした。
決定した処理方式の案は次のとおりである。
D社システムは、スケジューラによって1日に数回、在庫調整処理を起動する。D社Webサイトでその公演の販売停止を行った後、データベース(以下、DBという)から処理対象公演全席分のチケットを抽出し、一つのファイル(以下、I/Fファイルという)に編集してC社へ送信する。
C社システムは、D社からI/Fファイルを受信すると、在庫調整処理を開始する。C社Webサイトでその公演の販売停止を行った後、DBから処理対象公演全席分のチケット在庫データを抽出する。C社は、D社のチケット在庫データを表に変換後の在庫移動処理を行い、処理結果のチケット在庫データをDBに反映し、C社Webサイトでその公演の販売再開を行った後、処理対象公演全席分の在庫移動結果をI/Fファイルに編集してD社へ送信する。
D社システムは、C社からI/Fファイルを受信すると、処理結果のチケット在庫データをDBに反映した後、D社Webサイトでその公演の販売再開を行う。
通信の異常などで、C社からのI/Fファイル送信のエラーを検出した場合、又はD社側でI/Fファイル受信タイムアウトを検出した場合は、その時点でC社、D社とも在庫調整処理前のDBの状態で販売を再開する。
〔ファイル形式の検討〕
在庫調整処理で使用するI/Fファイルの形式として、“CSV形式”と“XML形式”を比較した。
検討の結果、aの追加によってデータ項目を追加できるという、“XML形式”の拡張性に注目して、ファイル形式は“XML形式”を採用することにした。
〔シーケンス図の作成〕
E氏とF氏は、ここまでの検討を基に処理のシーケンス図を作成した。作成したシーケンス図を図1に示す。


図1中の“タイマ”オブジェクト、“処理生成”、及び“タイムアウト発生”以降のメッセージは、シーケンス図作成段階で、①“C社ファイル送信がエラーとなった場合にD社Webサイトで不具合が発生する”という問題に対応するために追加した処理である。
〔テストで見つかった不具合〕
在庫調整処理中に回線の不通によって C社ファイル送信がエラーとなる異常系のテストを行ったところ、あるチケット在庫に関する C社 Webサイト、D社 Webサイトでの販売状況に、シーケンス図の誤りに起因する不具合が発生した。
表2の項番3に該当するテストデータでは一部のチケット在庫が C社 Webサイト、D社 Webサイトの両方で d 、表2の項番4に該当するテストデータでは一部のチケット在庫が C社 Webサイト、D社 Webサイトの両方で e となることが確認された。
E 氏と F 氏は、シーケンス図の不具合を修正するために、② C社在庫調整処理が呼び出す、又は受け取る“処理結果反映”、“販売再開”、“C社ファイル送信”、及び“C社ファイル受信用答”のメッセージの順序を見直した。
設問1:
本文中のaに入れる適切な字句を答えよ。
模範解答
a:要素
解説
解答の論理構成
- 問題文の該当箇所
在庫調整処理で使用するI/Fファイルの形式として、“CSV形式”と“XML形式”を比較した。検討の結果、aの追加によってデータ項目を追加できるという、“XML形式”の拡張性に注目して、ファイル形式は“XML形式”を採用することにした。
- ここで XML の拡張性を生む仕組みは、階層構造を持つ「要素」を任意に追加できる点です。CSV は列追加が必須ですが、XML では新しいデータ項目を「要素」としてタグ内に追加すれば既存システムとの互換を保てます。
- したがって a には「要素」が入ることで文意が完全に成立します。
結論:
a = 要素
a = 要素
誤りやすいポイント
- 「タグ」と解答してしまう
XML では開始タグ・終了タグで要素を表現しますが、追加できるのは構造体そのもの=要素です。 - CSV でも列追加で拡張可能と早合点する
CSV の列追加はフォーマット変更となりパース側の改修が必要になるため、“追加しやすい”という要件を満たしません。 - 「属性」と混同する
XML では属性も拡張に使えますが、問題文は“データ項目を追加”と述べており、内容を包む単位として要素が適切です。
FAQ
Q: XML の要素を追加しても既存システムが壊れないのはなぜですか?
A: 未使用の要素を無視する汎用 XML パーサが一般的で、バリデーションを緩めに設定すれば追加要素によるエラーが起こりにくいためです。
A: 未使用の要素を無視する汎用 XML パーサが一般的で、バリデーションを緩めに設定すれば追加要素によるエラーが起こりにくいためです。
Q: 要素ではなく属性で拡張すると何が問題になりますか?
A: 属性は階層構造を持てず、複雑なデータを表現しにくいほか、追加時に要素内容との混在で可読性が低下する場合があります。
A: 属性は階層構造を持てず、複雑なデータを表現しにくいほか、追加時に要素内容との混在で可読性が低下する場合があります。
Q: CSV にスキーマ情報を付ければ同様の拡張性を得られますか?
A: 可能ですがメタデータ送付やバージョン管理が必要になり、問題文の「できるだけ費用を掛けずに済む方式」に反します。
A: 可能ですがメタデータ送付やバージョン管理が必要になり、問題文の「できるだけ費用を掛けずに済む方式」に反します。
関連キーワード: XML, CSV, 要素, スキーマ, データ交換
設問2:〔シーケンス図の作成〕について、(1)、(2)に答えよ。
(1)タイムアウト処理がない場合に発生する、本文中の下線①の不具合の原因とはどのような内容か。20字以内で述べよ。
模範解答
対象公演が販売停止のままとなる。
解説
解答の論理構成
- 【問題文】では、「通信の異常などで、C社からのI/Fファイル送信のエラーを検出した場合、又はD社側でI/Fファイル受信タイムアウトを検出した場合は、その時点でC社、D社とも在庫調整処理前のDBの状態で販売を再開する。」と規定しています。
- ところがシーケンス図(タイムアウト処理追加前)には、
「C社 在庫調整処理 → D社 在庫調整処理:C社ファイル送信」
「C社 在庫調整処理 → D社 在庫調整処理:C社ファイル受信回答」
の後段で “販売再開” が描かれており、C社ファイル送信がエラーになるとこのメッセージ列が実行されません。 - 下線①の指摘は、「“C社ファイル送信がエラーとなった場合にD社Webサイトで不具合が発生する”」というものです。
- つまり、C社ファイル送信エラー時に“販売再開”メッセージが送られないため、D社Webサイトは販売停止状態を解除できず、対象公演だけがいつまでも販売停止になります。
- よって不具合の原因は「販売再開処理が実行されず、対象公演が販売停止のまま残ること」と説明できます。
誤りやすいポイント
- “タイムアウト発生”を図に追加した理由と、下線①の不具合内容を混同してしまい、原因と結果を逆に記述する。
- 「C社Webサイト」か「D社Webサイト」かを取り違え、販売停止が継続するサイトを誤答する。
- 不具合の原因を“在庫が不一致になる”と広く捉え過ぎ、販売再開メッセージ欠落に絞り込まない。
FAQ
Q: なぜC社側ではなくD社側の販売が停止し続けるのですか?
A: C社ファイル送信エラーはC社で検出されますが、D社側へ“販売再開”メッセージが届かないため、D社Webサイトは処理中断を認識できず販売を再開できません。
A: C社ファイル送信エラーはC社で検出されますが、D社側へ“販売再開”メッセージが届かないため、D社Webサイトは処理中断を認識できず販売を再開できません。
Q: タイムアウト処理を入れると何が解決されるのですか?
A: タイマが一定時間内に“販売再開”を確認できない場合に強制的に処理を中止し、D社在庫調整処理からD社販売処理へ“販売再開”を送ることで、販売停止の継続を防止します。
A: タイマが一定時間内に“販売再開”を確認できない場合に強制的に処理を中止し、D社在庫調整処理からD社販売処理へ“販売再開”を送ることで、販売停止の継続を防止します。
Q: エラー発生時にDBロールバックだけでは不十分なのですか?
A: DBを元に戻しても、Webサイト側が販売停止状態のままでは利用者からは購入できません。DB整合性と販売再開の両方が必要です。
A: DBを元に戻しても、Webサイト側が販売停止状態のままでは利用者からは購入できません。DB整合性と販売再開の両方が必要です。
関連キーワード: タイムアウト制御, シーケンス図, 非機能要件, メッセージ順序
設問2:〔シーケンス図の作成〕について、(1)、(2)に答えよ。
(2)図1中のb、cに入れる分岐の条件は何か。図1中のメッセージ名称を用いた適切な字句を答えよ。
模範解答
b:C社ファイル受信回答未実施
c:C社ファイル受信回答済み
解説
解答の論理構成
-
【問題文】には
“通信の異常などで、C社からのI/Fファイル送信のエラーを検出した場合、又はD社側でI/Fファイル受信タイムアウトを検出した場合は、その時点でC社、D社とも在庫調整処理前のDBの状態で販売を再開する。”
とあります。
したがってタイマが “タイムアウト発生” を通知した直後、まだ C社ファイル受信回答 が返って来ていないならば、在庫調整処理は未完了なので D 社は即座に “販売再開” を行う必要があります。 -
一方、すでに C社ファイル受信回答 が返って来ている場合は、
① C 社側での在庫移動結果が D 社へ正常に返却済み
② D 社はその結果を用いて DB 反映を完了済み
の状態です。ここでタイムアウトが発生しても、追加で行う処理はありません。従って “(何も行わない)” 分岐になります。 -
以上より分岐条件は次のように整理できます。
• b:C社ファイル受信回答未実施(未受信)
• c:C社ファイル受信回答済み(受信済み)
誤りやすいポイント
- “タイムアウト発生” の対象が C社ファイル送信 ではなく C社ファイル受信回答 であると混同しやすい点。
- “販売再開” を C 社・D 社どちらが送るか取り違えやすい。タイムアウト後の主導は D 社側です。
- “未実施/済み” をメッセージの名前ではなく状態変数で表記して減点されるケース。
FAQ
Q: “C社ファイル受信用答” と “C社ファイル受信回答” の表記が混在していますが?
A: 本設問では図中のメッセージ名 “C社ファイル受信回答” を用いるよう指示されています。問題文中の別表記と混同しないよう注意してください。
A: 本設問では図中のメッセージ名 “C社ファイル受信回答” を用いるよう指示されています。問題文中の別表記と混同しないよう注意してください。
Q: タイムアウトが発生しても C 社側は販売再開しないのですか?
A: C 社はすでに “販売再開” を送信済み、またはタイムアウト後に D 社からの通知を受けて販売再開します。設問の焦点は D 社側の分岐条件なので、C 社の動作は問いません。
A: C 社はすでに “販売再開” を送信済み、またはタイムアウト後に D 社からの通知を受けて販売再開します。設問の焦点は D 社側の分岐条件なので、C 社の動作は問いません。
Q: “販売再開” を送るタイミングが早すぎると在庫が不整合になりませんか?
A: 未処理のまま販売再開すると不整合になるため、条件 b のときにのみ即時販売再開を行い、c の場合は何も行わず既に整合が取れている状態を維持します。
A: 未処理のまま販売再開すると不整合になるため、条件 b のときにのみ即時販売再開を行い、c の場合は何も行わず既に整合が取れている状態を維持します。
関連キーワード: タイムアウト制御, 疎結合ファイル連携, 異常系設計, シーケンス図, 取消処理
設問3:〔テストで見つかった不具合〕について、(1)、(2)に答えよ。
(1)本文中のd、eに入れる適切な字句を答えよ。
模範解答
d:販売可能
e:販売不可
解説
解答の論理構成
- 問題文では、異常系テスト時に「表2の項番3に該当するテストデータでは一部のチケット在庫が C 社 Webサイト、D 社 Webサイトの両方で d 、表2の項番4に該当するテストデータでは一部のチケット在庫が C 社 Webサイト、D 社 Webサイトの両方で e となる」と記載されています。
- 表2の項番3は「C社の販売可能なチケット在庫が50席未満、D社の販売可能なチケット在庫が51席以上」という“D社→C社”への在庫移動ケースです。移動完了前に通信エラーで処理が宙に浮くと、
・C社側は在庫を受け取り更新済み
・D社側は在庫をまだ保持
という“二重在庫”が生じ、両サイトで当該座席が購入できてしまいます。したがって d は「販売可能」と判断できます。 - 表2の項番4は「C社の販売可能なチケット在庫が51席以上、D社の販売可能なチケット在庫が50席未満」という“C社→D社”への在庫移動ケースです。同様にエラーが起きると、
・C社側は在庫を移動済みで手元に残らない
・D社側はまだ在庫を受け取っていない
ため、両サイトとも当該座席を売れる状態にありません。よって e は「販売不可」となります。
結論
d:販売可能
e:販売不可
d:販売可能
e:販売不可
誤りやすいポイント
- 「在庫が重複して見える=販売済み」ではなく“販売可能”である点を取り違えやすい。
- 表2の項番3と項番4の方向(D社→C社 と C社→D社)を逆に覚えてしまうと答えが入れ替わる。
- 障害時は「両社とも在庫調整処理前のDBの状態で販売を再開する」という仕様を、そのまま実装順序が正しい前提で解釈し、シーケンス図の誤りによる不整合を想像し損ねやすい。
FAQ
Q: なぜ項番3で“販売済み”ではなく“販売可能”になるのですか?
A: C社は在庫を受け取り未販売として登録し、D社は在庫を削除できていないため同じ座席を二重に保持します。どちらも“未販売”なので購入可能状態になります。
A: C社は在庫を受け取り未販売として登録し、D社は在庫を削除できていないため同じ座席を二重に保持します。どちらも“未販売”なので購入可能状態になります。
Q: 在庫が両社で“販売不可”になる状況はどう起こるのですか?
A: 項番4ではC社が在庫を移動済みで削除し、D社は受信前にエラーで停止します。結果として両社のDBに該当在庫が存在しないため販売画面には出ません。
A: 項番4ではC社が在庫を移動済みで削除し、D社は受信前にエラーで停止します。結果として両社のDBに該当在庫が存在しないため販売画面には出ません。
Q: 障害回復策としてはどのタイミングでロールバックすべきですか?
A: 「処理結果反映」より前に通信異常を検出した場合はDBを更新しない、“反映後”に異常を検出した場合はトランザクションを一括で取り消す、といった方式で整合性を保つのが一般的です。
A: 「処理結果反映」より前に通信異常を検出した場合はDBを更新しない、“反映後”に異常を検出した場合はトランザクションを一括で取り消す、といった方式で整合性を保つのが一般的です。
関連キーワード: トランザクション制御, タイムアウト処理, シーケンス図, 二重更新, 障害復旧
設問3:〔テストで見つかった不具合〕について、(1)、(2)に答えよ。
(2)本文中の下線②で“処理結果反映”、“販売再開”、“C社ファイル送信”、及び“C社ファイル受信回答”のメッセージの順序をどのように修正したか。修正後の処理順を解答群の記号を用いて答えよ。
解答群
ア:処理結果反映
イ:販売再開
ウ:C社ファイル送信
エ:C社ファイル受信回答
模範解答
(ウ)→(エ)→(ア)→(イ)
解説
解答の論理構成
-
原設計の手順
【問題文】には、C社側の通常処理順として
「処理結果のチケット在庫データをDBに反映し、C社Webサイトでその公演の販売再開を行った後、…I/Fファイルに編集してD社へ送信する。」
とあります。すなわち
① 処理結果反映 → ② 販売再開 → ③ C社ファイル送信 → ④ C社ファイル受信回答
という順序でした。 -
不具合の発生メカニズム
同じく【問題文】には
「通信の異常などで、C社からのI/Fファイル送信のエラーを検出した場合…C社、D社とも在庫調整処理前のDBの状態で販売を再開する。」
と規定されています。
ところが原設計では、C社はDBを更新して販売を再開した“後”にファイル送信を行います。もしこの送信が失敗すると
・C社…新しい在庫状態を公開
・D社…タイムアウトを検知し旧状態へロールバック
という不整合が生じ、下線①の「C社ファイル送信がエラーとなった場合にD社Webサイトで不具合が発生する」という問題が現実化します。 -
必要な修正方針
不整合を避けるには、
A. C社が確実にファイル送信成功を確認(=受信回答を受領)するまではDBを更新しない。
B. 双方の販売再開は、DBが確定した後に実施する。
という二相コミットに類似した流れが望まれます。 -
修正後の最適順序
以上より、C社側のメッセージ順は
ウ:C社ファイル送信 → エ:C社ファイル受信回答 → ア:処理結果反映 → イ:販売再開
が妥当となります。これなら送信エラー時点でDBは未変更のままなので、D社がタイムアウトで処理を中止しても両社が同じ(調整前)状態を保てます。
誤りやすいポイント
- 「ファイル送信が終わってからDB更新では処理が二度手間」と考え、原設計を正しいと思い込む。ネットワーク障害時の整合性を見落としがちです。
- 受信回答(ACK)を軽視して、送信完了=成功と誤認する。実際にはACKが届かなければ転送の成否は確定しません。
- 販売再開をDB反映より先に置くと、在庫数と画面表示が乖離して不正な重複販売を招きます。
FAQ
Q: 処理結果反映をファイル送信より後ろにすると、送信するファイルの内容はどう作るのですか?
A: 反映前に“結果候補”をメモリや一時テーブルへ出力しておき、その内容でI/Fファイルを生成します。ACKが届いた時点で正式にDBへコミットします。
A: 反映前に“結果候補”をメモリや一時テーブルへ出力しておき、その内容でI/Fファイルを生成します。ACKが届いた時点で正式にDBへコミットします。
Q: 受信回答が来ない場合、C社はロールバックするのですか?
A: はい。ACKを一定時間内に受信できなければ送信失敗と判断し、在庫調整前の状態に戻したうえで販売を再開します。
A: はい。ACKを一定時間内に受信できなければ送信失敗と判断し、在庫調整前の状態に戻したうえで販売を再開します。
Q: 二相コミット・プロトコルそのものを使えば良かったのでは?
A: V社の「できるだけ費用を掛けずに済む方式」という要望があり、汎用DBの二相コミット機能より低コストなファイル連携+ACKで実装したと考えられます。
A: V社の「できるだけ費用を掛けずに済む方式」という要望があり、汎用DBの二相コミット機能より低コストなファイル連携+ACKで実装したと考えられます。
関連キーワード: 整合性制御, 二相コミット, ACK応答, 障害復旧


