SQLのCOMMITとROLLBACKとは?トランザクション操作を初心者向けに完全解説
生徒
「データベースのトランザクションって何ですか?COMMITとかROLLBACKとか聞いたことがあるんですけど...」
先生
「トランザクションは、データベースの操作をひとまとめにして実行する仕組みです。COMMITは変更を確定させる命令で、ROLLBACKは変更を取り消す命令ですよ。」
生徒
「なんだか難しそうですね...初心者でも理解できますか?」
先生
「大丈夫です。鉛筆で書いた文字を消しゴムで消すイメージで考えると分かりやすいですよ。順番に説明していきましょう。」
1. トランザクションとは?データベース操作の基本概念
トランザクションとは、データベースに対する一連の操作をひとまとまりとして扱う仕組みのことです。例えば、銀行の振込を考えてみましょう。Aさんの口座から1万円を引き出して、Bさんの口座に1万円を入金する、という2つの操作は必ずセットで成功しなければなりません。
もし途中でエラーが起きて、Aさんの口座からお金が引かれたのにBさんの口座に入金されなかったら大変ですよね。トランザクションは、このような複数の操作を「全部成功するか、全部失敗するか」のどちらかにする仕組みです。
2. COMMITとは?変更を確定させる命令
COMMITは、データベースへの変更を正式に確定させる命令です。鉛筆で書いた下書きをペンでなぞって清書するようなイメージです。一度COMMITすると、その変更は永続的にデータベースに保存され、他のユーザーからも見えるようになります。
COMMITの基本的な使い方
まず、トランザクションを開始してデータを更新し、その後COMMITで確定させる流れを見てみましょう。以下は会員テーブルのデータを更新する例です。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 田中美咲 | 22 | misaki@example.com
BEGIN;
UPDATE members
SET age = 26
WHERE name = '山田太郎';
COMMIT;
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 26 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 田中美咲 | 22 | misaki@example.com
このように、BEGINでトランザクションを開始し、UPDATE文でデータを変更し、最後にCOMMITで変更を確定させます。COMMITを実行すると、山田太郎さんの年齢が25歳から26歳に正式に変更されます。
3. ROLLBACKとは?変更を取り消す命令
ROLLBACKは、トランザクション内で行った変更を取り消す命令です。消しゴムで文字を消すように、データベースへの変更をなかったことにできます。間違った操作をしてしまったときや、エラーが発生したときに使います。
ROLLBACKの基本的な使い方
同じ会員テーブルを使って、ROLLBACKの動作を確認してみましょう。今度は変更を取り消す例です。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 田中美咲 | 22 | misaki@example.com
BEGIN;
DELETE FROM members
WHERE age < 20;
ROLLBACK;
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 田中美咲 | 22 | misaki@example.com
DELETE文で20歳未満のデータを削除しようとしましたが、ROLLBACKを実行したため、削除は取り消されました。テーブルは元の状態のままです。このように、ROLLBACKを使えば、間違った操作をしてもデータを守ることができます。
4. COMMITとROLLBACKの違いを比較
COMMITとROLLBACKの違いを表で整理してみましょう。
| 項目 | COMMIT | ROLLBACK |
|---|---|---|
| 役割 | 変更を確定させる | 変更を取り消す |
| 使うタイミング | 操作が正常に完了したとき | エラーが発生したときや操作を取り消したいとき |
| データへの影響 | 永続的に保存される | トランザクション開始前の状態に戻る |
| 他のユーザーからの見え方 | 変更が見えるようになる | 変更は見えない(元の状態のまま) |
5. 実践的な例:銀行の振込処理でトランザクションを使う
銀行の振込処理を例に、トランザクションの重要性を理解しましょう。AさんからBさんへ5000円を振り込む処理を考えます。
id | name | balance
---+------------+---------
1 | Aさん | 10000
2 | Bさん | 5000
3 | Cさん | 20000
4 | Dさん | 15000
BEGIN;
UPDATE accounts
SET balance = balance - 5000
WHERE name = 'Aさん';
UPDATE accounts
SET balance = balance + 5000
WHERE name = 'Bさん';
COMMIT;
id | name | balance
---+------------+---------
1 | Aさん | 5000
2 | Bさん | 10000
3 | Cさん | 20000
4 | Dさん | 15000
この例では、Aさんの残高から5000円を引き、Bさんの残高に5000円を足しています。もし途中でエラーが起きた場合は、自動的にROLLBACKが実行され、両方の操作が取り消されます。これにより、お金が消えたり増えたりする問題を防げます。
6. トランザクションを使うときの注意点
トランザクションは必ず終了させる
BEGINでトランザクションを開始したら、必ずCOMMITかROLLBACKで終了させましょう。終了しないと、他のユーザーがデータにアクセスできなくなることがあります。
データの整合性を保つ
トランザクションは、データの整合性を保つための重要な仕組みです。複数の操作を行うときは、必ずトランザクションで囲むようにしましょう。特に、お金や在庫など、数値が変わる処理では必須です。
長時間のトランザクションは避ける
トランザクションが長時間続くと、データベース全体のパフォーマンスが低下します。必要な操作だけをトランザクションに含め、素早く完了させることが大切です。
7. 自動コミットとは?デフォルトの動作を知ろう
多くのデータベースシステムでは、自動コミット機能がオンになっています。これは、SQL文を実行するたびに自動的にCOMMITされる機能です。つまり、明示的にBEGINを書かない限り、一つ一つのSQL文が独立したトランザクションとして扱われます。
複数の操作をまとめて実行したい場合は、必ずBEGINでトランザクションを明示的に開始する必要があります。自動コミットの設定は、データベースの設定やツールによって変更できます。