概要

送金処理」を例に考える: 口座 A から 1000 円引いて、口座 B に 1000 円足す。これは 2 つの UPDATE で実現するが、1 つ目だけ成功して 2 つ目で失敗したら 1000 円が消える。「全部成功するか・全部失敗するか」を DB に宣言できる仕組みが トランザクション だ。

PHP では $pdo->beginTransaction() で「ここから先は一塊」と宣言し、すべて問題なければ $pdo->commit() で確定、途中で例外が出たら $pdo->rollBack()すべて巻き戻すtry { begin → SQL → commit } catch { rollBack → throw } のテンプレが定石で、exception トピックで学んだ例外処理と完全にセットで使う。

保証される性質は ACID で、特に重要なのが A (Atomicity) = 「全部か無か」の原子性。送金・複数テーブル一括 INSERT・複数行 UPDATE のように 論理的に 1 つの操作 をやるときは必ずトランザクションで括る。逆に SELECT だけや単一行更新ならトランザクション不要 (DB が 1 文単位で原子的に処理する)。

学習目標

ドリル

no 内容
01 2 件 INSERT を 1 トランザクションで実行 → commit → SELECT 確認
02 1 件目成功 → 2 件目で例外 → rollBack → 何も追加されていない

演習: ドリル 01 — 2 件 INSERT を commit

問題

accounts テーブルに次の 2 件を 1 つのトランザクションで INSERT してから commit し、 最後に "commit" と出力し、続けて id 昇順で "{id}: {balance}" を全件出してください。

追加する 2 件:

初期データは空 (テーブルだけある状態)。

期待される出力:

commit
10: 1000
11: 2000

ヒント

演習: ドリル 02 — エラーで rollBack

問題

accounts テーブルに 2 件 INSERT しようとして、2 件目で意図的に失敗 させ、 rollBack で全部巻き戻したい。最後に SELECT したとき何も追加されていないことを示す。

INSERT 内容:

try ... catch (PDOException $e) で例外を捕まえて rollBack を呼び、 そのとき "rollback" と出力してください。 その後、SELECT で残った行を id 昇順で "{id}: {balance}" 形式で出す。

初期データは空。 rollBack されたので 1 件目も取り消され、SELECT は 0 件

期待される出力:

rollback

ヒント

この章を AI に聞く

  1. 「ch08 — トランザクション」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch08 — トランザクション」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch08 — トランザクション」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch08 — トランザクション」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE