Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysqli_提交失败是否会自动回滚?_Php_Mysqli_Commit_Rollback - Fatal编程技术网

Php mysqli_提交失败是否会自动回滚?

Php mysqli_提交失败是否会自动回滚?,php,mysqli,commit,rollback,Php,Mysqli,Commit,Rollback,我对PHP手册中的这段代码如何操作有一些疑问。我看到了其他抛出异常(通常是面向对象代码)或使用标志跟踪每个查询失败的示例 我的问题是,在决定提交或回滚之前,为什么必须标记错误并测试标记。看看下面的例子,如果提交不起作用,那么无论如何都不会提交任何查询 我还注意到它们只是在提交失败时退出。这会自动回滚所有内容吗 <?php $link = mysqli_connect("localhost", "my_user", "my_password", "test"); /* check conn

我对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故障是否会自动回滚

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

<?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 */

你从哪里开始交易?@Sven在代码中可以清楚地看到。太好了!这正是我需要的!