【问题标题】:MySQL: automatic rollback on transaction failureMySQL:事务失败时自动回滚
【发布时间】:2010-05-10 21:16:05
【问题描述】:

有没有办法让 MySQL 在第一次出现错误/警告时自动回滚任何事务?

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

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

谢谢

【问题讨论】:

    标签: mysql database transactions


    【解决方案1】:

    我不知道这样的功能,但我也看不出检查失败意味着更多的调用:

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

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

    【讨论】:

    • 第一个调用是事务,第二个是回滚,然后乘以事务数。我想发送一个包含更多事务的文件,我希望 mysql 执行所有事务并回滚任何失败的事务。
    【解决方案2】:

    抱歉,您需要自己执行此操作。 我不是 PHP 人,但在 SQL 中:如果您创建一个事务并在该事务中执行多个 MySQL 操作,如果您回滚该事务,则所有内容都将回滚。注意:您需要使用事务存储引擎并且必须将自动提交设置为关闭。

    如果您只关心事务协调流量,那么您可以创建一个存储过程并简单地调用它。

    数据库不自动提交或回滚的原因是因为它不知道您要做什么,提交一些数据并回滚其他数据在应用程序中可能是可以接受的。

    【讨论】:

    • 我的问题是不是很糟糕?我知道事务是如何工作的,我也只询问 mysql 解决方案,所以你是非 PHP 人很好。请告诉我应该在哪个部分更清楚地说明这个问题。
    • @praksant 如果我没有用我写的东西回答这个问题,那你要什么?
    • 我问是否有办法自动回滚,因为它不是默认的工作方式。我在我的问题中解释了默认情况下它的行为方式。我想消除检查 PHP 是否失败,因为这意味着每笔交易需要 1-2 次调用。如果它自动回滚,我将能够在一次调用中执行许多事务,这将提高性能。
    • 感谢您的更新。我需要简单的逻辑 - 如果(发生任何错误)回滚,否则提交。在 PHP 或其他语言中很容易在每个事务之后检查错误,并相应地提交/回滚。我只是想提高性能。如果 mysql 在远程机器上,每次调用都非常昂贵。存储过程可以做到这一点,但我希望在事务中具有更大的灵活性,并且存储过程的维护/测试不是很容易。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 2018-09-21
      • 1970-01-01
      相关资源
      最近更新 更多