我已阅读在线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
,那么您不需要执行回滚,因为事务没有被处理。我说的对吗?
BEGIN TRANSACTION
END
块中,则此方法有效。因此,如果事务块中的任何语句失败,则会回滚事务。 - DevZer0INSERT INTO myCity (id) VALUES (100), (200), (300), (100);
进行呢?这样要么所有值都成功,要么所有值都失败。 - eggyalBEGIN WORK
的讨论来分散这个有效问题,这完全是不必要的,只会让事情更加混乱。我的前几条评论只是想解释这一点。如果你感到冒犯了,我很抱歉。 - eggyal