トランザクションの使い方

まとめて確定・取り消し

書き方

BEGIN; … COMMIT;
BEGIN; … ROLLBACK;
SAVEPOINT 名前; ROLLBACK TO 名前;

BEGIN から COMMIT までの変更はまとめて確定し、ROLLBACK で全部取り消します。Oracle は BEGIN なしで、COMMIT するまで確定しません。

よく使うオプション

オプション意味
BEGINトランザクションを始める(START TRANSACTION も同じ)
COMMIT変更をまとめて確定する
ROLLBACKBEGIN からの変更を全部取り消す
SAVEPOINT 名前途中に戻る地点を作る
ROLLBACK TO 名前その地点まで戻す

例

BEGIN;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
COMMIT;

口座 1 から口座 2 へ 5000 円を移します。2 つの UPDATE は、両方とも確定するか、両方とも取り消されるかのどちらかです。

BEGIN;
DELETE FROM orders WHERE status = 'cancel';
ROLLBACK;BEGIN
DELETE 23
ROLLBACK

消してみてから、ROLLBACK で取り消します。消える件数を確かめたいときに使えます。

BEGIN;
INSERT INTO departments VALUES (5, '法務');
SAVEPOINT s1;
INSERT INTO departments VALUES (6, '監査');
ROLLBACK TO s1;
COMMIT;

法務の部署だけが残ります。SAVEPOINT の後の変更だけを取り消せます。

よくある間違い・注意

  • PostgreSQL では、トランザクションの中でエラーが起きると、ROLLBACK するまで次の文が通りません。
  • Oracle には BEGIN がなく、COMMIT するまで変更は確定しません。ほかの人からも見えません。
  • 長いあいだ COMMIT しないと、ほかの人の更新を待たせることがあります。

実際に打って練習する

SQL コースの Lv46「まとめて確定する トランザクション」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。

Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。

SQL 構文一覧(使い方と例)へ戻る