PostgreSQLのトランザクション完全入門!BEGIN・COMMIT・ROLLBACKを初心者向けにやさしく解説
生徒
「PostgreSQLを勉強していたら、BEGINとかCOMMITとかROLLBACKって言葉が出てきました。何をしているんですか?」
先生
「それはトランザクションと呼ばれる仕組みです。いくつかの作業をまとめて、安全に実行するための約束事だと思ってください。」
生徒
「パソコンをほとんど触ったことがなくても理解できますか?」
先生
「大丈夫です。買い物やメモ帳の例を使いながら、一つずつ説明していきます。」
1. PostgreSQLのトランザクションとは何か?
PostgreSQLのトランザクションとは、「いくつかのSQL操作を、ひとまとまりの作業として扱う仕組み」です。 たとえば、銀行でお金を振り込むときは「引き出す」「振り込む」という二つの作業があります。 どちらか一方だけが成功してしまうと困りますよね。 トランザクションは、このような失敗を防ぐために使われます。
PostgreSQLでは、BEGINで作業を開始し、COMMITで確定、ROLLBACKで取り消しを行います。 これにより、データベースの中身を安全に守ることができます。
2. サンプルで使うテーブルの中身
ここでは、会員情報を管理するテーブルを例にします。 データベースのテーブルは、紙の名簿のようなものだと考えてください。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
3. BEGINでトランザクションを開始する
BEGINは、「ここからまとめて作業を始めます」という合図です。 メモ帳で言えば、下書きを始めるようなイメージです。 この時点では、変更はまだ確定していません。
BEGIN;
UPDATE users
SET age = age + 1
WHERE id = 1;
このSQLでは、idが1の人の年齢を1つ増やしています。 ただし、まだCOMMITしていないので、正式には保存されていない状態です。
4. COMMITで変更を確定する
COMMITは、「今までの作業を正式に保存します」という命令です。 ノートにペンで清書するような感覚で覚えてください。 COMMITを実行すると、変更内容はデータベースにしっかり保存されます。
COMMIT;
COMMIT後のテーブルの状態は次のようになります。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 26 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5. ROLLBACKで変更を取り消す
ROLLBACKは、「やっぱり今の作業はなかったことにします」という命令です。 消しゴムで下書きを消すイメージをすると分かりやすいです。 ミスに気づいたときでも、安全に元の状態に戻せます。
BEGIN;
DELETE FROM users
WHERE age < 20;
ROLLBACK;
このSQLでは、20歳未満の人を削除しようとしていますが、ROLLBACKを実行しているため削除は取り消されます。 テーブルの中身は、実行前と同じ状態のままです。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 26 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
6. トランザクションを使うと何がうれしいのか
PostgreSQLでBEGIN・COMMIT・ROLLBACKを使うと、データの安全性が大きく向上します。 途中でパソコンが止まったり、操作を間違えたりしても、データが壊れにくくなります。
特に、追加・更新・削除をまとめて行うときは、トランザクションを使うことがとても重要です。 PostgreSQLはこの仕組みがとても強力なので、業務システムやWebサービスでも安心して使われています。