【PHP】トランザクションの書き方

トランザクションとは?
トランザクションは MySQL データベースに複数のデータを保存するときに役立つ機能です。
例えば、30人分の試験結果をデータベースに保存するとします。
全て問題なく登録できれば良いですが、16人目で何かエラーが起きて登録に失敗するかもしれません。
このとき15人目までの登録処理をキャンセルしてくれるのがトランザクションです。
トランザクションを使うと「全て登録できる」か「全て登録できない」かのどちらかになります。
1件だけ登録できていなかったという状況を防ぐためにも、トランザクションを使えるようになっておきましょう。
準備
PHP ファイルの用意
今回はローカル環境(MAMP)を利用しているので htdocs フォルダに transaction.php というファイルを用意しています。
ファイル名などはご自身の環境に合わせて変更してください。

データベースの用意
データベース名は test として、以下のように user テーブルを用意しています。

カラム名 | データ型 | NULL | |
---|---|---|---|
id | int | いいえ | AUTO_INCREMENT |
name | varchar(10) | いいえ | |
age | int | いいえ |
データベースに接続する
まずはデータベース接続するコードを書きます。
ユーザー名とパスワード
$user と $password は MySQL 管理画面にログインするときに使っているものです。
XAMPP を使っている方で、ログイン設定を変更していない場合は
// XAMPP
$user = 'root';
$password = '';
となります。
ブラウザで確認
ブラウザで transactions.php を開いて「データベースに接続しました。」と表示されることを確認してください。

トランザクションでデータを保存する
基本的な構造
まずはトランザクションの実行に最低限必要なコードを紹介します。

5行目
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Exception(例外)を受け取るために必要な設定です。
これを書かないと catch で例外を受け取ることができないのでご注意ください。
7行目
$pdo->beginTransaction();
トランザクションを開始します。
11行目
$pdo->commit();
データ保存などのコードに問題がなければ実行されます。
14行目
$pdo->rollBack();
途中で問題が起きたら処理を取り消します。
データを保存する
次はデータを保存するコードを
- エラーの起きないバージョン
- エラーになるバージョン
の2通りで書いて、トランザクションの動きを確認してみましょう。
①エラーの起きないバージョン
22行目の finally には エラーが出ても出なくても最後に実行するコードを書くことができます。
ブラウザで transaction.php を開いてみましょう。「トランザクション開始・終了」のメッセージが出ましたか?

user テーブルにも3つのデータが保存されています。

②エラーになるバージョン
次はエラーになるバージョンのコードにして、トランザクションの動きを確認してみましょう。
11行目の
$pdo->exec('INSERT INTO user(name, age) VALUES("鈴木", 25)');
を
$pdo->exec('INSERT INTO user(name, age) VALUES("鈴木")');
に変更して、コードを実行してみましょう。
ブラウザにエラーメッセージが表示されて、データも保存されていないと思います。

今回は「鈴木」のデータが保存できなかったので、前の「山田」が取り消されて、次の「佐藤」は実行されませんでした。

このように途中で問題が起こったときに登録処理をキャンセルしてくれるのがトランザクションです。
まとめ
今回は簡単なデータ保存でしたが、カラム数が増えても、以下の構造を押さえておけば簡単にトランザクションを使うことができます。
トランザクションを使ったことがない方もぜひお試しください!