我对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);
?>
答案 0 :(得分:3)
查看下面的示例,如果提交不起作用,则无论如何都不会提交任何查询。
右。
但关键是错误不仅可能发生在提交中。但是 - 甚至更可能 - 执行其中一个查询。所以你需要检查不只有提交结果,而且每个查询的结果都会中止整个操作。
所以,你的问题应该是
mysqli失败会自动回滚吗?
答案是&#34;是的,不是&#34;
默认情况下,它赢了。
但是,如果您设法在查询失败时中止脚本,则链接将被关闭,并且事务将自动回滚。下面的代码转换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 */