概要
PHPのオブジェクト型(PDO)でMySQLのトランザクションを確認。
トランザクション中の動作はデータベースステートメントには設定されるが、トランザクション終了後のコミット/ロールバックによって設定結果がデータベースに反映されるかどうかが決まる。
確認コード
- 5行目でトランザクションでコミットフラグを
true
にセット - 通常モードで’one’を書き込み
- 14行目でトランザクション開始
- ‘two’, ‘three’を書き込み
- 25行目でコミット、トランザクション確定
- 通常モードへは自動的に復帰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php $dsn = 'mysql:host=localhost;charset=utf8mb4;dbname=testdb'; $pdo = new PDO($dsn, 'testuser', 'test', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $commit = true; echo '>WRITE one<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('one')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>TRANSACTION START<br>'; $pdo->beginTransaction(); echo '>WRITE two, three<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('two')"); $pdo->query("INSERT INTO test_table (data) VALUES ('three')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>TRANSACTION END<br>'; if ($commit) { $pdo->commit(); } else { $pdo->rollBack(); } $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>WRITE four<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('four')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } $pdo = null; ?> |
確認結果
以下、出力を見ながらトランザクションの動作を確認。
- 通常モードでは普通に書き込み
- トランザクション開始後、データベースステートメントの内容は指示通り設定
- トランザクション終了後、データベース内容の変更が確認できる
- 通常モード復帰後も普通に書き込み
以下は出力結果で、終了後のデータベースの内容は’one’, ‘two’, ‘three’, ‘four’となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one two three >WRITE four one two three four |
次にコミットフラグを$commit=false
にすると、commit()
メソッドではなくrollback()
メソッドが実行され、実行結果は以下のようになる。
- 通常モードで普通に’one’が書き込まれる
- トランザクションに入り、データベースステートメントには’two’, ‘three’が設定される
- トランザクション終了後にロールバックされると、データベースステートメントがデータベースに反映されてもトランザクション中の’two’, ‘three’は書き込まれない
- 通常モードに復帰後’four’が書き込まれる
1 2 3 4 5 6 7 8 9 10 11 12 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one >WRITE four one four |