本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第5章 安全に変更する · レッスン20

トランザクション ― まとめて成功、まとめて取り消し

ブラウザで完結

導入

「A さんの口座から1万円引いて、B さんの口座に1万円足す」――この2つは、片方だけ成功しては困ります。引いたのに足せなかったら、お金が消えます。「複数の変更を、ぜんぶ成功させるか、ぜんぶ無かったことにするか」のどちらかにまとめる仕組みが トランザクション です。

説明

トランザクションは3つのキーワードで扱います。

  • BEGIN; … ここから開始(「ここからはまとめて扱う」の宣言)。
  • COMMIT; … ここまでの変更を確定する。
  • ROLLBACK; … ここまでの変更をすべて取り消すBEGIN の直前の状態に戻す)。
flowchart LR
    B["BEGIN<br/>開始"] --> C1["変更1"]
    C1 --> C2["変更2"]
    C2 --> Q{"すべて成功?"}
    Q -->|"はい"| CM["COMMIT<br/>まとめて確定"]
    Q -->|"いいえ"| RB["ROLLBACK<br/>まとめて取消(無かったことに)"]

まず「取り消し」を体験してみましょう。ROLLBACK すると、途中の UPDATE は無かったことになります。

BEGIN;
UPDATE users SET city = '沖縄' WHERE id = 1;
ROLLBACK;
SELECT id, name, city FROM users WHERE id = 1;

最後の SELECT を見ると、city は元のまま。UPDATE は実行したのに、ROLLBACK で取り消されたからです。一方、COMMIT すれば変更は確定します。

BEGIN;
UPDATE users SET city = '沖縄' WHERE id = 1;
INSERT INTO orders (id, user_id, ordered_at, status) VALUES (8, 1, '2026-05-01', 'pending');
COMMIT;

BEGIN から COMMIT までの2つの変更は、まとめて1つとして確定します。途中でエラーになれば ROLLBACK してどの変更も残さない――こうして「中途半端な状態」を防ぐのがトランザクションの役割です。

やってみよう

初期表示のクエリBEGINUPDATEROLLBACK)を実行してから、SELECT id, name, city FROM users WHERE id = 1; を実行してください。city が変わっていないこと(=取り消されたこと)を確認しましょう。次に ROLLBACKCOMMIT に変えて同じことを試すと、今度は変更が残ります。

演習

BEGIN で始め、users田中さん(id=4)の city を ‘広島’ に更新したうえで、その変更を**取り消す(ROLLBACK)**トランザクションを書いてください。

ヒント1を見る

BEGIN;UPDATE ... WHERE id = 4;ROLLBACK; の3文を順に並べます。

ヒント2を見る

BEGIN; UPDATE users SET city = '広島' WHERE id = 4; ROLLBACK;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。