MySQL:事务失败时自动回滚

时间:2010-05-10 21:16:06

标签: mysql database transactions

有没有办法让MySQL自动回滚第一个错误/警告的任何事务?

现在如果一切顺利,它会提交,但是在失败时它会使事务处于打开状态,而在另一个事务开始时它会从失败的事务中提交不完整的更改。所以我需要自动回滚那些失败的交易..

(我正在执行来自php的查询,但我不想在php中检查失败,因为它会在mysql服务器和网络服务器之间进行更多调用。)

谢谢

3 个答案:

答案 0 :(得分:1)

抱歉,您需要自己动手。 我不是PHP人员,但在SQL中:如果你创建一个事务并在事务中做几个MySQL操作,如果你回滚事务,一切都将被回滚。注意:您需要使用事务存储引擎,并且必须将自动提交设置为关闭。

如果你关心的只是交易协调流量,那么你可以创建一个存储过程并简单地调用它。

数据库未自动提交或回滚的原因是因为它不知道您要执行的操作,在应用程序中提交某些数据并回滚其他数据可能是可以接受的。

答案 1 :(得分:1)

我不知道这样的功能,但我也没有看到如何检查失败意味着更多的电话:

try:
     <my code>
except:
     transaction.rollback()
     raise
else:
     transaction.commit()

- 它在Python / Django中,但它应该直接转换为PHP - 无论是否存在问题(异常),它都需要完全相同数量的代码来启动新事务。

答案 2 :(得分:0)

将autocommit设置为false的关键点。

<?php
$database= new mysqli("sever", "user", "key", "database");
$database->autocommit(FALSE);
$error=0;

//asumming we want to delete a users infomation from two table
$database->query("delete from `pay` where `user`=1 ")?NULL:$error=1;
$database->query("delete from `users` where `id`=1 ")?NULL:$error=1;

if($error=0){
    $database->commit();
}  else {
    $database->rollback();
}
$database->close();
?>
相关问题