ITパスポート 2015年 秋期 問71
問題文
処理一覧に示す実行順に、トランザクション1〜4を実行する。あるトランザクションが途中で異常終了し、トランザクションを中断してロールバックした結果、データAとデータBが残った。異常終了したトランザクションはどれか。ここで、トランザクションが正常終了したときにコミットを行い、次のトランザクションがあれば、それを実行する。異常終了したときは、当該トランザクション以降のトランザクションを実行しないものとする。

選択肢
ア:トランザクション1
イ:トランザクション2
ウ:トランザクション3
エ:トランザクション4(正解)
🔒 解説は解答すると表示されます
処理一覧のトランザクション実行と異常終了の判定【ITパスポート 解説】
正解の理由
最終的にデータAとデータBの両方が残っている状態になるため、最後に実行された「データBを削除する」処理が実行されていないことが分かります。問題の条件では、トランザクションが正常終了するとコミット(変更を確定)し、異常終了した場合はそのトランザクションをロールバック(そのトランザクションの変更を取り消す)して以降のトランザクションは実行しない、となっています。したがって、最後のトランザクションであるトランザクション4が途中で異常終了してロールバックされたため、Bの削除が取り消されてBが残り、既にコミット済みのA作成(トランザクション3)も有効なままになっている、という流れになります。よって異常終了したのはエ(トランザクション4)です。
(用語説明)
- トランザクション:データベースなどで「一連の処理をひとかたまりとして扱う単位」。全部成功すれば確定、途中で失敗すれば全て取り消す。
- コミット(commit):トランザクションの変更を確定すること(永久に反映)。
- ロールバック(rollback):トランザクションの変更を取り消すこと(なかったことにする)。
解法ステップ
- 処理順に結果を追うことを考えます。重要なのは「正常ならコミット」「異常ならそのトランザクションはロールバックされ、以降は実行しない」というルールです。
- 順に状態を確認します。
- トランザクション1(データAを作成) → 正常終了してコミットされたと仮定すると、Aが存在。
- トランザクション2(データBを作成、Aを削除) → 正常終了してコミットすると、Bが存在、Aは削除される。
- トランザクション3(データAを作成) → 正常終了してコミットすると、Aが再度存在、Bも存在。
- トランザクション4(データBを削除) → もし正常にコミットされればBは消えるため、最終状態は「Aのみ」。しかし問題の最終状態は「AとBが残っている」ので、トランザクション4の削除が行われていないことになります。
- さらにルールの「異常終了したら以降は実行しない」を考慮すると、最後に異常終了したのはトランザクション4であると確定します。
選択肢別の誤答解説
-
ア: トランザクション1
誤り。もしトランザクション1が異常でロールバックされ、以降のトランザクションは実行されないなら、最終的に何も存在しない(AもBもない)状態になります。問題の最終状態(AとBが残る)と合いません。 -
イ: トランザクション2
誤り。トランザクション2が異常でロールバックされれば、以降のトランザクション(3と4)は実行されないので、結果はトランザクション1の作成したAだけが残ります(Bは作成されない)。これも不一致です。 -
ウ: トランザクション3
誤り。トランザクション3が異常でロールバックされれば、以降のトランザクション(4)は実行されません。その場合、トランザクション2までの状態(Bが存在、Aは削除)が最終状態になり、Aが存在するという条件に合いません。 -
エ: トランザクション4
正しい。トランザクション4が途中で異常終了してロールバックされたため、Bの削除は取り消され、以降の処理もないので最終的にAとBが両方残る状態になります。
よくある誤解
-
「ロールバックはそれ以前にコミットされた処理も取り消す」
誤解です。ロールバックは基本的にロールバック対象のトランザクション内の変更を取り消します。既にコミットされたトランザクションの変更は通常取り消されません(コミットは永続化されるため)。 -
「異常終了したトランザクションの後のトランザクションだけが止まる」
問題文のルールでは「当該トランザクション以降のトランザクションを実行しない」となっています。つまり異常終了したトランザクション自身もロールバックされ、その後のトランザクションは実行されません。 -
「削除処理が実行されていればコミットされていなくても取り消されない」
実際は、削除などの変更もコミットされていなければロールバックで取り消されます。実行=永続化ではない点に注意してください。
補足コラム
データベースのトランザクションには「ACID」という重要な性質があります。簡単に説明すると:
- Atomicity(原子性): トランザクションは「全部成功するか全部失敗するか」のどちらか。途中の状態が残らない。
- Consistency(整合性): トランザクション実行後もデータのルールが保たれる。
- Isolation(独立性): 同時に実行されるトランザクションは互いに影響しないように見える。
- Durability(永続性): コミットされた変更は障害が起きても残る。
今回の問題は「原子性(失敗したらそのトランザクションの変更は取り消される)」と「永続性(コミット済みの変更はそのまま残る)」の理解が鍵になります。
FAQ
Q: 異常終了したトランザクションで部分的に行われた変更はどうなる?
A: ロールバックされ、当該トランザクションが開始する前の状態に戻ります(そのトランザクション内の変更はなかったことになる)。
A: ロールバックされ、当該トランザクションが開始する前の状態に戻ります(そのトランザクション内の変更はなかったことになる)。
Q: コミットされたトランザクションは後から取り消せる?
A: 通常のトランザクション管理ではコミットされた変更は永続化され、ロールバックでは消せません。取り消すには別の更新トランザクションを実行する必要があります。
A: 通常のトランザクション管理ではコミットされた変更は永続化され、ロールバックでは消せません。取り消すには別の更新トランザクションを実行する必要があります。
Q: 複数トランザクションが同時に動いていたら結果は変わる?
A: 並行実行(同時実行)では排他制御やロックなどで整合性を保ちます。今回の問題は順次実行(直列実行)を仮定しているため、同時実行は考慮不要です。
A: 並行実行(同時実行)では排他制御やロックなどで整合性を保ちます。今回の問題は順次実行(直列実行)を仮定しているため、同時実行は考慮不要です。
関連キーワード: トランザクション、ロールバック、コミット、ACID、データベース整合性、原子性

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

