This is an example to explain the powerful of the rollback and commit functions.
Let's suppose you want to be sure that all queries have to be executed without errors before writing data on the database.
Here's the code:
<?php
$all_query_ok=true; // our control variable
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
hope to be helpful!
mysqli::commit
mysqli_commit
(PHP 5)
mysqli::commit -- mysqli_commit — 現在のトランザクションをコミットする
説明
オブジェクト指向型
bool mysqli::commit
([ int
$flags
[, string $name
]] )手続き型
データベース接続の現在のトランザクションをコミットします。
パラメータ
-
link -
手続き型のみ: mysqli_connect() あるいは mysqli_init() が返すリンク ID。
-
flags -
定数
MYSQLI_TRANS_COR_*のビットマスク。 -
name -
指定した場合は、COMMIT/*name*/ を実行します。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.5.0 |
flags と name
が追加されました。
|
例
例1 mysqli::commit() の例
オブジェクト指向型
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* 接続をチェックします */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");
/* autocommit を off にします */
$mysqli->autocommit(FALSE);
/* データを挿入します */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* トランザクションをコミットします */
$mysqli->commit();
/* テーブルを削除します */
$mysqli->query("DROP TABLE Language");
/* 接続を閉じます */
$mysqli->close();
?>
手続き型
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* 接続をチェックします */
if (!$link) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* autocommit を off にします */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
/* データを挿入します */
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* トランザクションをコミットします */
mysqli_commit($link);
/* 接続を閉じます */
mysqli_close($link);
?>
参考
- mysqli_autocommit() - データベース更新の自動コミットをオンまたはオフにする
- mysqli_begin_transaction() - Starts a transaction
- mysqli_rollback() - 現在のトランザクションをロールバックする
- mysqli_savepoint() - Set a named transaction savepoint
Lorenzo - webmaster AT 4tour DOT it ¶
4 years ago
Bob Johnson ¶
3 years ago
The compactness of Lorenzo's code is admirable.
However, it is a good idea to also check $mysqli->affected_rows to make sure that the INSERT statement did not fail.
<?php
$result_query = @mysqli_query($query, $connect);
if (($result_query == false) &&
(mysqli_affected_rows($connect) == 0))
{
// verify the query executed completely and verify that it
// had impact on the table
$success = false;
// here also, the developer could choose to add a ROLLBACK
// statement
}
?>
