我已经阅读了在线 php 手册,但我仍然不确定这两个函数的工作方式:mysqli::commit 和 mysqli::rollback。
我要做的第一件事是:
$mysqli->autocommit(FALSE);
然后我做了一些查询:
$mysqli->query("...");
$mysqli->query("...");
$mysqli->query("...");
然后我通过执行以下操作提交由这 3 个查询组成的事务:
$mysqli->commit();
但是在其中一个查询不起作用的不幸情况下,所有 3 个查询都被取消还是我必须自己调用回滚?我希望所有 3 个查询都是原子的,并且只被视为一个查询。如果一个查询失败,那么所有 3 个都应该失败并且没有效果。
我问这个是因为在我在手册页上看到的评论中:http : //php.net/manual/en/mysqli.commit.php 如果其中一个查询失败,用户 Lorenzo 会调用回滚。
如果 3 个查询是原子的,那么回滚有什么好处?我不明白。
编辑:这是我怀疑的代码示例:
<?php
$all_query_ok=true; // our control variable
$mysqli->autocommit(false);
//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();
?>
我认为这段代码是错误的,因为如果任何查询失败,$all_query_ok==false
那么您就不需要回滚,因为事务没有被处理。我对吗?