概要
PHPの手続き型(mysqli)でMySQLのトランザクションを確認。
トランザクション中の動作はデータベースリンクには設定されるが、トランザクション終了後のコミット/ロールバックによって設定結果がデータベースに反映されるかどうかが決まる。
確認コード
- 7行目でトランザクションでコミットフラグを
true
にセット - 通常モードで’one’を書き込み
- 20行目でトランザクション開始
- ‘two’, ‘three’を書き込み
- 33行目でコミット、トランザクション確定
- 41行目で通常モードに復帰
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 41 42 43 44 45 46 47 48 49 50 51 52 |
<?php $host = 'localhost'; $user = 'testuser'; $pass = 'test'; $dbname = 'testdb'; $commit = true; $dblink = mysqli_connect($host, $user, $pass, $dbname); mysqli_set_charset($dblink, 'UTF8'); echo '>WRITE one<br>'; $query = "INSERT INTO test_table (data) VALUES ('one')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } echo '>TRANSACTION START<br>'; mysqli_autocommit($dblink, false); echo '>WRITE two, three<br>'; $query = "INSERT INTO test_table (data) VALUES ('two')"; mysqli_query($dblink, $query); $query = "INSERT INTO test_table (data) VALUES ('three')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } echo '>TRANSACTION END<br>'; if ($commit) { mysqli_commit($dblink); } else { mysqli_rollback($dblink); } $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } mysqli_autocommit($dblink, true); echo '>WRITE four<br>'; $query = "INSERT INTO test_table (data) VALUES ('four')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } mysqli_free_result($result); mysqli_close($dblink); ?> |
確認結果
以下、出力を見ながらトランザクションの動作を確認。
- 通常モードでは普通に書き込み
- トランザクション開始後、データベースリンクの内容は指示通り設定
- トランザクション終了後、データベース内容の変更が確認できる
- 通常モード復帰後も普通に書き込み
以下は出力結果で、終了後のデータベースの内容は’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
にすると、msqli_commit()
ではなくmsqli_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 |