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");
/* Recommended: using API to control transactional settings */
$mysqli->autocommit(false);
/* Won't be monitored and recognized by the replication and the load balancing plugin */
$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 サーバーは、 全てのステートメントをロールバックできるわけではないことに注意して下さい。 ステートメントによっては、 暗黙のうちにコミットされるものもあります。
参照