mysqli_commit失败会自动回滚吗


Does a mysqli_commit failure automatically rollback?

我对PHP手册中的代码如何操作有一些疑问。我看到其他例子抛出异常(通常是面向对象的代码)或使用标志来跟踪每个单独查询的失败。

我的问题是,在决定提交或回滚之前,为什么必须标记错误并测试标记。看看下面的例子,如果提交不起作用,那么无论如何都不会提交任何查询。

我还注意到,它们只是在提交失败时退出。这会自动回滚所有内容吗?

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* check connection */
if (!$link) {
    printf("Connect failed: %s'n", mysqli_connect_error());
    exit();
}
/* set autocommit to off */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
/* Insert some values */
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F',     11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
if (!mysqli_commit($link)) {
    print("Transaction commit failed'n");
    exit();
}
/* close connection */
mysqli_close($link);
?>

看看下面的例子,如果提交不起作用,那么无论如何都不会提交任何查询。

对。

但关键是,错误不仅可能在提交时发生但是-更可能的是-执行其中一个查询因此,您不仅需要检查提交结果,还需要检查每个查询的结果,并中止整个操作。

所以,你的问题应该读作

mysqli失败会自动回滚吗?

答案是"是和否"
默认情况下不会
但是,如果您在查询失败时设法中止脚本,则链接将关闭,事务将自动回滚。下面的代码将mysql错误转换为PHP致命错误,如果其中一个查询失败,这些错误将自动回滚。

<?php
/* set the proper error reporting mode */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* set autocommit to off */
mysqli_autocommit($link, FALSE);
/* Run your queries */
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)");
/* commit transaction */
mysqli_commit($link);
/* this is the last line, NO other code is needed */