mysqli_commit 失败会自动回滚吗?

Posted

技术标签:

【中文标题】mysqli_commit 失败会自动回滚吗?【英文标题】:Does a mysqli_commit failure automatically rollback? 【发布时间】:2016-08-30 12:01:39 【问题描述】:

我对 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', 'Sw***', 'F', 9.4)");

/* commit transaction */
if (!mysqli_commit($link)) 
    print("Transaction commit failed\n");
    exit();


/* close connection */
mysqli_close($link);
?>

【问题讨论】:

您从哪里开始交易? @Sven 在代码中可以看得很清楚。 【参考方案1】:

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

没错。

但重点是,错误可能不仅发生在提交中。而且 - 更有可能 - 执行了其中一个查询。 所以你需要检查不只有提交结果,还有每个查询的结果并中止整个操作。

所以,你的问题应该读作

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', 'Sw***', 'F', 9.4)");

/* commit transaction */
mysqli_commit($link);

/* this is the last line, NO other code is needed */

【讨论】:

完美!这正是我所需要的!

以上是关于mysqli_commit 失败会自动回滚吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 执行失败时事务会回滚吗?

在不自动提交的情况下,回滚段有啥用。

PLSQL事务提交了,要怎么回滚

在 MySQL 中提交后有啥方法可以回滚吗?

mysql触发器的实战(触发器执行失败,sql会回滚吗)

java 事务方法调用非事务函数会回滚吗