"商品"表に対して,更新SQL文を実行するトランザクションが,デッドロックの発生によって異常終了した。
異常終了後の"商品"表はどれか。
ここで,"商品"表に対する他のトランザクションは,参照は行うが更新はしないものとする。
商品
商品コード|商品名|販売単価/A010|AAA|2,500/B020|BBB|1,000/C030|CCC|4,500
〔更新SQL文〕
DELETE FROM 商品 WHERE 商品コード = 'B020'
正答2
解説
正解は2です。
この問題は、トランザクションが異常終了したときにデータベースがどうなるかを問うています。
トランザクションには、全部実行されるか全く実行されないかのどちらかになるという原子性があります。
異常終了したトランザクションの更新は、ロールバックによって取り消されます。
【選択肢別解説】
1:× 商品コードB020の行の商品名だけがNULLになっています。
DELETE文は行全体を削除する命令なので、一部の列がNULLになる状態はそもそも生じません。
また、異常終了した更新は取り消されるので、この状態にはなりません。
2:○ デッドロックで異常終了したトランザクションはロールバックされ、DELETEは取り消されます。
そのため「商品」表は、B020の行を含む元の3行のままです。
3:× B020の行が削除された状態は、DELETEが正常にコミットされた場合の結果です。
異常終了したので、この削除は取り消されます。
4:× B020の行だけが残る状態は、削除の条件を逆に適用した結果です。
DELETEの実行結果としても、ロールバック後の状態としても誤りです。
【ポイント】
トランザクションの性質は、原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、耐久性(Durability)の頭文字でACID特性と呼びます。
異常終了時はロールバック、障害からの復旧でコミット済みの更新をやり直すのはロールフォワードです。