【问题标题】:will mysqli->rollback(), rollback every query that has been previously committed?mysqli->rollback() 会回滚之前提交的每个查询吗?
【发布时间】:2012-12-09 07:40:26
【问题描述】:

我想知道mysqli->rollback 是否会回滚所有在回滚之前已经提交的查询。

例如,在下面的代码中,第一个查询将被提交,但第二个查询会因为拼写错误的“用户名”而失败。这是否意味着回滚之前的查询会或不会被执行?

$mysqli->autocommit(FALSE);

$query = "INSERT INTO users (username, password) VALUES ('user123', '1apple')";
$query2 = "INSERT INTO users (**usernam**, password) VALUES ('user987', '2apple')";

if($resrouce = $mysqli->query($query)){

    $mysqli->commit();

    if($resource2 = $mysqli->query($query2)){

        $mysqli->commit();

    }else{

        $mysqli->rollback();

    }

}else{
    $mysqli->rollback();
}

【问题讨论】:

  • Rollback 只回滚尚未提交的语句...

标签: php transactions mysqli commit rollback


【解决方案1】:

修改第 8 行并在代码末尾添加一行:

$mysqli->autocommit(FALSE);

$query = "INSERT INTO users (username, password) VALUES ('user123', '1apple')";
$query2 = "INSERT INTO users (**usernam**, password) VALUES ('user987', '2apple')";

if($resrouce = $mysqli->query($query)){

    //$mysqli->commit(); this not necesary

    if($resource2 = $mysqli->query($query2)){

        $mysqli->commit();

    }else{

        $mysqli->rollback();

    }

}else{
    $mysqli->rollback();
}

$mysqli->close();

【讨论】:

    【解决方案2】:

    我个人发现 PDO 库比 mysqli 更适合数据库访问。您可以检查: http://php.net/manual/en/pdo.begintransaction.php

    这正是您需要的...希望对您有所帮助

    【讨论】:

    • PDO 以何种方式使人能够回滚已提交的事务?
    • 啊,不幸的是,手册含糊不清。第二句“在调用 PDO::commit() 结束事务之前不会提交通过 PDO 对象实例对数据库所做的更改”是关键;第三句“调用 PDO::rollBack() 将回滚对数据库的所有更改并将连接返回到自动提交模式。”应该更清楚,只有在当前事务中进行的未提交更改/更改将被回滚。
    • 我很确定如果你将整个事情包装在一个 try catch 块中,如果提交抛出错误,它应该回滚整个事情。否则,如果您无法回滚状态,那么开始使用事务有什么意义......
    • 当然,如果提交失败,那么显然任何更新都不会提交,并且回滚会将数据库恢复到事务前状态。但是一旦提交成功,事务就结束了,不能再回滚了。
    【解决方案3】:

    事务一旦提交,不能回滚,只能回滚尚未提交的语句

    【讨论】:

    • 好吧,你可以执行point-in-time recovery...但你是对的,这并不是真正意义上的“回滚”。
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2017-07-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多