MySQL サーバーは、使っているストレージエンジンによっては、 トランザクションをサポートしています。 MySQL 5.5 以降は、 デフォルトのストレージエンジンは InnoDB です。 InnoDB は、トランザクションの ACID 特性を完全にサポートしています。
トランザクションは、 SQL または API を呼び出すことによって制御できます。 autocommit
モードを有効にしたり、 無効にしたりする目的や、トランザクションをコミットしたり、 ロールバックする目的には、API 呼び出しを使うことを推奨します。
例1 autocommit
モードをSQL と API を使って設定する
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query('SET AUTOCOMMIT = 0');
レプリケーションやロードバランシングプラグインのような、 オプションの機能パッケージによっては、 API の呼び出しを容易に監視できるものもあります。 レプリケーションプラグインは、 トランザクションが API 呼び出しによって制御されている場合に、 それを考慮したロードバランシングを提供します。 トランザクションを考慮したロードバランシングは、 SQL を使って autocommit
モードが設定されたり、 コミットやロールバックが行われる場合には利用できません。
例2 コミットとロールバック
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query("INSERT INTO test(id) VALUES (1)");
$mysqli->rollback();
$mysqli->query("INSERT INTO test(id) VALUES (2)");
$mysqli->commit();
MySQL サーバーは、 全てのステートメントをロールバックできるわけではないことに注意して下さい。 ステートメントによっては、 暗黙のうちにコミットされるものもあります。
参照