導入
「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 してどの変更も残さない――こうして「中途半端な状態」を防ぐのがトランザクションの役割です。
やってみよう
初期表示のクエリ(BEGIN → UPDATE → ROLLBACK)を実行してから、SELECT id, name, city FROM users WHERE id = 1; を実行してください。city が変わっていないこと(=取り消されたこと)を確認しましょう。次に ROLLBACK を COMMIT に変えて同じことを試すと、今度は変更が残ります。
演習
BEGIN で始め、users の田中さん(id=4)の city を ‘広島’ に更新したうえで、その変更を**取り消す(ROLLBACK)**トランザクションを書いてください。
ヒント1を見る
BEGIN; → UPDATE ... WHERE id = 4; → ROLLBACK; の3文を順に並べます。
ヒント2を見る
BEGIN; UPDATE users SET city = '広島' WHERE id = 4; ROLLBACK;