データベースの基礎
口座表で、トランザクションを開始し、口座Aの残高から300を引く UPDATE と、口座Bの残高に300を足す UPDATE を実行した。その後、COMMITの代わりに ROLLBACK を実行した。口座表はどうなるか。
- A口座Bへの加算だけが取り消され、口座Aの減算は残る
- B2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る
- CUPDATEはすでに実行されているので、どちらも取り消されない
答えと解説を見る
正解:B. 2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る
トランザクションは、データベースに対する一連の処理を、まとめて1つの単位として扱う仕組みです。トランザクションの中で行った更新は、COMMITを実行すると確定し、ROLLBACKを実行するとすべて取り消されて、トランザクションを開始する前の状態に戻ります。この例では、口座Aの減算と口座Bの加算がどちらも取り消され、2つの口座の残高は元のままです。振替の途中でエラーが起きたときにROLLBACKすれば、一方の口座だけが更新された中途半端な状態が残りません。一部だけを取り消したい場合は、SAVEPOINTで途中に目印を付けておき、ROLLBACK TO SAVEPOINT でそこまで戻す方法もあります。
- A. ROLLBACKは、最後の文だけでなく、トランザクションの中のすべての更新を取り消します。
- B. 正しい。COMMITしていない更新はすべて取り消され、開始前の状態に戻ります。
- C. COMMITする前の更新は確定していないので、ROLLBACKで取り消されます。