【入門編】 トランザクション制御(BEGIN, COMMIT, ROLLBACK) – PostgreSQL

はい、承知いたしました! PostgreSQL のトランザクション制御について、IT初心者の方にも分かりやすく、まるで隣で一緒にコーヒーでも飲みながらお話しするような感覚で、ブログ記事を執筆しますね。専門用語は極力避け、日常の出来事に例えながら、楽しく学べるように工夫します。

—

☕️ PostgreSQL の「トランザクション」って、実は日常とそっくり? 始め方・終わり方・やり直し方をマスターしよう!

こんにちは! いつもブログを読んでくださってありがとうございます。皆さんは PostgreSQL を使っていますか? 「データベースって難しそう…」なんて思っている方も、もしかしたらいるかもしれませんね。でも、大丈夫! 今日は、データベースの「トランザクション」という、とっても大事な概念について、実は皆さんが普段やっていることとそっくりな例え話で、楽しく解説していきたいと思います。

🤔 「トランザクション」って、一体何者?

さて、「トランザクション」と聞くと、なんだか専門的で難しそうな響きがありますよね。でも、これを理解すると、データベースが「あれ? 思ってたよりずっと賢いし、頼りになる!」って思えてくるはずです。

例えるなら、「銀行でお金をおろしたり、振り込んだりする一連の流れ」みたいなものなんです。

例えば、AさんがBさんに1万円を振り込むとしましょう。この時、データベースの中では、

1. Aさんの口座から1万円引く
2. Bさんの口座に1万円足す

という2つの操作が行われます。

ここで、もし1番目の「Aさんの口座から1万円引く」はうまくいったのに、2番目の「Bさんの口座に1万円足す」が途中でエラーになってしまったら…? Aさんの口座からはお金が減ったのに、Bさんの口座には入らない、なんて、とんでもないことになってしまいますよね!

こんな事態を防ぐために、データベースには「トランザクション」という仕組みがあるんです。トランザクションとは、「一連のデータベース操作を、ひとまとまりのものとして扱う」という考え方です。そして、このまとまりの中の操作は、「全部成功するか、全部失敗するか」のどちらかになるように、データベースが責任を持って管理してくれるんです。

この「全部成功するか、全部失敗するか」という、データベースの信頼性を保証する性質のことを、専門用語で ACID特性 と言ったりします。ちょっと専門的ですが、今は「データベースがちゃんと仕事をしてくれるための、すごい約束事」くらいに思っておいてくださいね!

🚀 トランザクション、始めてみよう! (BEGIN)

では、この「一連の操作をひとまとめにする」という作業を、実際に PostgreSQL でどうやるのか見ていきましょう。

まず、トランザクションを始めるには、こんなコマンドを使います。

BEGIN;

または

START TRANSACTION;

この `BEGIN;` というコマンドは、まるで「よし、ここから一連の作業を始めるぞ!」という宣言のようなものです。これを実行すると、データベースは「あ、この後でいくつか操作があるんだな。全部終わるか、途中でダメになるか、どっちかだな」と、身構えてくれます。

例えば、先ほどの振込の例で言うと、

BEGIN; — ここから一連の操作を始めます!

— Aさんの口座から1万円引く処理 (例: UPDATE accounts SET balance = balance – 10000 WHERE account_id = ‘A’);
— Bさんの口座に1万円足す処理 (例: UPDATE accounts SET balance = balance + 10000 WHERE account_id = ‘B’);

— この後、全部うまくいったら COMMIT します。
— もし途中で何か問題があったら ROLLBACK します。

こんなイメージです。 `BEGIN;` を実行した時点では、まだデータベースの中身は何も変わっていません。あくまで、「これからやるよ!」という準備段階なんです。

✅ 完璧! 全員ハッピー! (COMMIT)

さて、一連の操作が全部うまくいったとしましょう。Aさんの口座からもちゃんと減って、Bさんの口座にもちゃんと増えた。よし、これで一件落着! という時に使うのが、このコマンドです。

COMMIT;

`COMMIT;` は、「ここまでの操作を、全部確定してください!」という意味です。このコマンドが実行されると、それまで `BEGIN;` から `COMMIT;` の間で行われた全ての変更が、正式にデータベースに記録されます。もう後戻りはできません!

銀行で例えるなら、振込手続きが全部完了して、「はい、これで手続き完了です!」と言われた状態ですね。これで、Aさんの口座からは減り、Bさんの口座には増えた、という事実が確定するわけです。

❌ あちゃー、失敗しちゃった… (ROLLBACK)

でも、世の中そんなに甘くありません。時には、途中で何らかの問題が発生してしまうこともあります。例えば、Aさんの口座からはお金が減ったんだけど、ネットワークの調子が悪くてBさんの口座に振り込めなかった、とか。

そんな時に使うのが、このコマンドです。

ROLLBACK;

`ROLLBACK;` は、「ここまでの操作を、全部取り消してください!」という意味です。このコマンドが実行されると、`BEGIN;` から `ROLLBACK;` の間で行われた全ての変更は、まるで何もなかったかのように、元に戻されます。

銀行の例で言うと、窓口で「やっぱりこの振込、やめます!」と言って、手続きをキャンセルしてもらうようなイメージです。Aさんの口座から減ったはずのお金も、ちゃんと元通りに戻ってきます。

これで、データベースは常に正しい状態を保つことができるんですね。すごいですよね!

💡 ちょっと待って! 中間地点で「ここまでOK」しておきたい!(SAVEPOINT)

ここまでで、トランザクションの基本である `BEGIN;`、`COMMIT;`、`ROLLBACK;` はなんとなくイメージできたかと思います。でも、実はもう一つ、とっても便利な機能があるんです。それが「セーブポイント」です。

セーブポイントとは、「トランザクションの途中で、『ここまでうまくいったよ!』という目印をつけておく」機能なんです。

例えば、すごく複雑な処理をするとき、いくつかの段階に分けられることがありますよね。

BEGIN;

— ステップ1: データを準備する処理
— … (処理 A) …

— ここまでうまくいった!もし後で失敗したら、この「準備完了」の状態に戻ろう。
SAVEPOINT savepoint_after_step1;

— ステップ2: データを加工する処理
— … (処理 B) …

— ステップ3: 最終的な登録処理
— … (処理 C) …

— 全部うまくいったら、ここで完了!
COMMIT;

こんな風に `SAVEPOINT` を使うと、もし「ステップ2」や「ステップ3」で問題が発生して `ROLLBACK` する必要が出たとしても、`ROLLBACK TO SAVEPOINT savepoint_after_step1;` というコマンドを使えば、「ステップ1」が終わった時点の状態まで戻ることができます。

「え、`ROLLBACK` で全部戻るんじゃないの?」と思ったかもしれません。そう、 `ROLLBACK;` だけだと、 `BEGIN;` の時点まで戻ってしまいます。でも、 `SAVEPOINT` を使えば、もっと細かく「この地点まで戻って、もう一度やり直そう」ということができるんです。

これは、ゲームで「ここまで進んだらセーブ!」するのと似ていますよね。万が一ゲームオーバーになっても、セーブしたところからやり直せば、また続きからプレイできます。トランザクションにおけるセーブポイントも、まさにそんな便利機能なんです。

まとめ

今日の話で、PostgreSQL のトランザクション制御の基本が、少しでも身近に感じられたら嬉しいです!

  • `BEGIN;`: 「さあ、一連の作業を始めるぞ!」の合図。
  • `COMMIT;`: 「全部うまくいった!これで確定!」
  • `ROLLBACK;`: 「あちゃー、失敗した!全部元に戻して!」
  • `SAVEPOINT`: 「ここまでOK!もしもの時のために、ここを印にしよう。」

これらのコマンドを使いこなせるようになると、データベース操作の安全性がぐっと高まります。ぜひ、実際のデータベースで試してみてくださいね!

もし、今日の記事が参考になったら、ぜひSNSでシェアしたり、コメントで感想を教えていただけると、とっても励みになります!

それでは、また次回のブログでお会いしましょう! 👋

コメント

タイトルとURLをコピーしました