基本情報技術者 2019年 秋期 午前(科目A) 問28
問題文
一つのトランザクションはトランザクションを開始した後、五つの状態(アクティブ、アボート処理中、アボート済、コミット処理中、コミット済)を取り得るものとする。このとき、取ることのない状態遷移はどれか。

選択肢
ア:
イ:(正解)
ウ:
エ:
一つのトランザクションの5状態に関する遷移 — 取ることのない状態遷移はどれか【午前2 解説】
要点まとめ
- 結論:一度アボート処理(ロールバック)に入ったトランザクションがコミット処理へ切り替わることはなく、選択肢イが取ることのない遷移です。
- 根拠:トランザクションの状態モデルではコミット系統とアボート系統が分岐して不可逆であり、アボート処理はロールバックへ収束するため逆戻りできません。
- 差がつくポイント:コミット処理中に障害が起き回復でアボート側へ流れる場合がある点と、アボート開始後は必ずアボート済に向かう不可逆性を混同しないことです。
正解の理由
選択肢イ(アボート処理中 → コミット処理中)が取ることのない遷移です。アボート処理が開始されたということはトランザクションがロールバック方向に決定された状態であり、以降はロールバック(アボート済)へ進む不可逆の経路となります。したがってアボート処理中から再びコミット処理中へ切り替わることは論理的に起こりません。
一方、コミット処理中からアボート処理中へ遷移することが考えられる場面(例えばコミット中に致命的な障害が発生し回復処理で中止・ロールバック指示が出る等)も現実には存在するため、コミット→アボートが必ず不可という定義にはなりません。本問題の標準的な状態図の定義では「アボート処理中→コミット処理中」だけが明らかにあり得ない遷移です。
よくある誤解
- アボートとコミットは単純に逆方向だからどちらも不可と考える誤り。コミット中→アボート中は障害時の回復であり得るため一概に不可ではありません。
- 「処理中」と「済(完了)」を混同し、処理中の状態を終端(済)と誤認するミス。処理中は途中で外部イベントにより別経路に行く可能性を考慮する必要があります。
- 図の分岐点がどこかを見落として「アクティブ」から直接行く経路を想定してしまうこと。出発点と終点の役割を整理してください。
解法ステップ
- 与えられた5状態(アクティブ、アボート処理中、アボート済、コミット処理中、コミット済)を紙に書き出す。
- 各状態が「決定的に終端(済)か処理中か」を判別する(済=終端、処理中=途中)。
- 通常の遷移パターンを想定する:アクティブ→(コミット処理中 or アボート処理中)、コミット処理中→コミット済、アボート処理中→アボート済。
- 各選択肢が上のパターンに合致するかを検証し、矛盾するものを除外する。
- アボート処理中→コミット処理中は矛盾するためこれを正解とする。
選択肢別の誤答解説
- ア:アボート処理中 → アボート済
- 可能な遷移です。アボート処理(ロールバック)が完了すればアボート済となります。
- イ:アボート処理中 → コミット処理中
- 不可能な遷移です。一度ロールバック方向に入ったトランザクションがコミット方向へ逆転することはありません。よって正解です。
- ウ:コミット処理中 → アボート処理中
- 一見逆転で不可に思えますが、コミット処理中に致命的障害や一貫性違反が発生した場合、回復手続きでアボート側に移行する場合があり得ます。したがって必ずしも「有り得ない」とは言えません。
- エ:コミット処理中 → コミット済
- 典型的かつ可能な遷移です。コミット処理が正常に完了すればコミット済です。
補足コラム
トランザクション状態図は実装やモデルにより表現が若干異なることがあります。基本的な考え方は「決定した方向(コミットかアボートか)は不可逆である」という点ですが、システム障害や分散トランザクション(例:二相コミット)の失敗時にはコミット側からアボート側への回復措置が必要になるケースがあります。そのため、教科書レベルの単純図と実運用での回復処理の区別を理解しておくことが重要です。
- 実務で注意する点:ログとリカバリ手順により、途中状態の処理(コミット中のログ書き込み失敗など)で最終判断が変わる可能性があるため、状態遷移図だけでなく回復プロトコルも合わせて学ぶこと。
FAQ
Q: コミット処理中→アボート処理中が本当にあり得るのですか?
A: あり得ます。例えばコミット中に耐久性を保証するためのログ書き込みが失敗し、復旧時にロールバックを選択するケースがあります。実装依存ですが、一般論として可能性は否定できません。
A: あり得ます。例えばコミット中に耐久性を保証するためのログ書き込みが失敗し、復旧時にロールバックを選択するケースがあります。実装依存ですが、一般論として可能性は否定できません。
Q: アボート処理中→コミット処理中が絶対にあり得ない根拠は?
A: アボート処理開始はロールバックを行うという決定を意味し、回復手順もロールバック方向へ進む。コミット方向へ戻すための論理的手段や意味が存在しないため不可です。
A: アボート処理開始はロールバックを行うという決定を意味し、回復手順もロールバック方向へ進む。コミット方向へ戻すための論理的手段や意味が存在しないため不可です。
Q: 本問と分散トランザクションの二相コミットは関係ありますか?
A: 関係あります。二相コミットでは参加者がコミット可否を投票し、その後コミット命令が出ます。段階により「コミット処理中」の扱いや回復時の振る舞いが複雑になりますが、アボート決定後にコミットへ戻ることは原則ありません。
A: 関係あります。二相コミットでは参加者がコミット可否を投票し、その後コミット命令が出ます。段階により「コミット処理中」の扱いや回復時の振る舞いが複雑になりますが、アボート決定後にコミットへ戻ることは原則ありません。
関連キーワード: トランザクション, ロールバック, コミット, 障害回復, ログベースリカバリ, 二相コミット, トランザクション管理, ACID, 状態遷移図, 回復プロトコル

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

