データベースの基礎

口座表で、トランザクションを開始し、口座Aの残高から300を引く UPDATE と、口座Bの残高に300を足す UPDATE を実行した。その後、COMMITの代わりに ROLLBACK を実行した。口座表はどうなるか。

  1. A口座Bへの加算だけが取り消され、口座Aの減算は残る
  2. B2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る
  3. CUPDATEはすでに実行されているので、どちらも取り消されない
答えと解説を見る

正解:B. 2つのUPDATEがどちらも取り消され、トランザクションを開始する前の状態に戻る

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

  • A. ROLLBACKは、最後の文だけでなく、トランザクションの中のすべての更新を取り消します。
  • B. 正しい。COMMITしていない更新はすべて取り消され、開始前の状態に戻ります。
  • C. COMMITする前の更新は確定していないので、ROLLBACKで取り消されます。
この分野を解く 分野ページへ

関連する計算ツール

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

データベースの基礎のほかの問題

  1. トランザクションが持つべきACID特性のうち、「口座Aから引き落として口座Bに入金する振替の処理が、途中で障害が起きても、両方とも行われるか、まったく行われないかのどちらかになる」という性質はどれか。
  2. 在庫表のある商品の在庫数は10である。トランザクションT1は在庫数を読み出して3を引いた値を書き込み、T2は在庫数を読み出して5を引いた値を書き込む。ロックをかけずに、T1の読み出し、T2の読み出し、T1の書き込み、T2の書き込みの順に実行されたとき、最終的な在庫数はいくつになるか。
  3. トランザクションを同時に実行したときに起きる問題のうち、ダーティリードの説明として正しいものはどれか。
  4. トランザクションT1が SELECT COUNT(*) FROM 注文 WHERE 金額 >= 1000 を実行したところ8件だった。その直後に、T2が金額2000の注文の行をINSERTしてコミットした。T1が同じSELECT文をもう一度実行すると9件になった。この現象はどれか。
  5. SQLの標準規格が定める分離レベルのうち、READ COMMITTED で起こりうる現象の組み合わせとして正しいものはどれか。