autocommit を無効にすると、commit 後も autocommit は無効なままなので次のようになると思います。
lang
1<?php
2// トランザクション開始
3$mysqli->autocommit(FALSE);
4$mysqli->query('UPDATE `t_test_table` SET `column`=8');
5$mysqli->query('UPDATE `t_test_table` SET `column`=10');
6$mysqli->commit();
7// トランザクション終了、そして開始
次のようにすると判りやすいです。
lang
1<?php
2// トランザクション開始
3$mysqli->autocommit(FALSE);
4$mysqli->query('UPDATE `t_test_table` SET `column`=8');
5$mysqli->query('UPDATE `t_test_table` SET `column`=10');
6$mysqli->commit();
7// トランザクション終了、そして開始
8$mysqli->query('UPDATE `t_test_table` SET `column`=12');
autocommit が無効なままだと最後の UPDATE はコミットされていないので反映されません。
たぶん MySQL だと次のような風にするのが一般的だと思います。
lang
1<?php
2// トランザクション開始
3$mysqli->begin_transaction();
4$mysqli->query('UPDATE `t_test_table` SET `column`=8');
5$mysqli->query('UPDATE `t_test_table` SET `column`=10');
6$mysqli->commit();
7// トランザクション終了
8
9// autocommit が ON なので即時反映される
10$mysqli->query('UPDATE `t_test_table` SET `column`=12');
さらに言えば、普通は次のように try-catch すると思います。
lang
1<?php
2$mysqli->begin_transaction();
3
4try {
5 $mysqli->query('UPDATE `t_test_table` SET `column`=8');
6 $mysqli->query('UPDATE `t_test_table` SET `column`=10');
7 $mysqli->commit();
8} catch (\Exception $ex) {
9 $mysqli->rollback();
10 throw $ex;
11}
さらにいえば rollback で発生する例外は無視するほうが良いかもしれません。
lang
1<?php
2$mysqli->begin_transaction();
3
4try {
5 $mysqli->query('UPDATE `t_test_table` SET `column`=8');
6 $mysqli->query('UPDATE `t_test_table` SET `column`=10');
7 $mysqli->commit();
8} catch (\Exception $ex) {
9 try {
10 $mysqli->rollback();
11 } catch (\Exception $ex2) {
12 }
13 throw $ex;
14}
というのも、try ブロックの実行中に MySQL との接続が切れたり、あるいは MySQL が死んだりすると rollback も失敗します。当然、rollback から例外が飛びます。すると、元々の query や commit で派生した例外は再送されないので失われます。
大抵の場合、rollback で発生した例外よりも query や commit で派生した例外の方が有用なので、rollback の例外は握りつぶして、query や commit の例外が再送された方が嬉しいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。