トランザクションの使い方
まとめて確定・取り消し
書き方
BEGIN; … COMMIT; BEGIN; … ROLLBACK; SAVEPOINT 名前; ROLLBACK TO 名前;
BEGIN から COMMIT までの変更はまとめて確定し、ROLLBACK で全部取り消します。Oracle は BEGIN なしで、COMMIT するまで確定しません。
よく使うオプション
| オプション | 意味 |
|---|---|
BEGIN | トランザクションを始める(START TRANSACTION も同じ) |
COMMIT | 変更をまとめて確定する |
ROLLBACK | BEGIN からの変更を全部取り消す |
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 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。