2012-12-21 33 views
2

我想知道mysqli-> rollback是否会回滚所有在回滚之前已经提交的查询。将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(); 
} 
+1

回滚只回滚尚未提交的语句... – eggyal

回答

4

一旦你提交事务,你不能回滚它,你只能回滚未comited尚未

+1

那么,您可以执行[时间点恢复](http://dev.mysql.com/doc/en/point-in-time-recovery.html)。 ..但是你是对的,这并不是真正意义上的“回滚”。 – eggyal

-3

我个人认为PDO图书馆更好地为比mysqli的数据库访问的声明。您可以检查: http://php.net/manual/en/pdo.begintransaction.php

这不正是你需要的...希望帮助

+2

PDO以什么方式启用回滚提交的事务? – eggyal

+0

http://php.net/manual/en/pdo.begintransaction.php 手册的前两行...? – Feras

+0

嗯,手册不幸含糊不清。除非通过调用PDO :: commit()*结束事务,否则不会提交第二句“通过PDO对象实例对数据库所做的更改”。第三个句子“*调用PDO :: rollBack()将回滚对数据库的所有更改并将连接返回到自动提交模式。*”应该更清楚,只有在当前事务中进行的未提交更改/更改才会回滚。 – eggyal

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();