## トランザクションのサポート

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 サーバーは、 全てのステートメントをロールバックできるわけではないことに注意して下さい。 ステートメントによっては、 暗黙のうちにコミットされるものもあります。

参照

- mysqli::autocommit()
- mysqli::begin_transaction()
- mysqli::commit()
- mysqli::rollback()

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open