CakeFest 2024: The Official CakePHP Conference

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

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

参照

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top