【问题标题】:How to judge whether or not a transaction succeeded or failed?如何判断一个事务是成功还是失败?
【发布时间】:2009-12-24 08:18:44
【问题描述】:

我正在使用 MySQL 和 PHP。

运行此事务:

begin;
....
commit;

在PHP中如何判断是否失败?

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

    检查结果(mysql_query, PHP Manual):

    对于 SELECT、SHOW、DESCRIBE、EXPLAIN 和其他返回结果集的语句,mysql_query() 成功时返回资源,错误时返回 FALSE。

    对于其他类型的 SQL 语句,INSERT、UPDATE、DELETE、DROP 等,mysql_query() 成功时返回 TRUE,错误时返回 FALSE。

    示例(PHP4 风格):EDIT:根据 johannes 的评论改进示例

    mysql_connect("localhost", "username", "password") or die( mysql_error() );
    
    mysql_select_db("test") or die(mysql_error());
    
    $query = "INSERT INTO ..."; //Query here
    
    mysql_query("BEGIN"); // transaction begins
    
    $result = mysql_query($query);
    
    if(!$result)
    {
        mysql_query("ROLLBACK"); //Transaction rolls back
        echo "Rolled Back.";
        exit;
    }
    else 
    {
        $committed = mysql_query("COMMIT"); //Commit Transaction
        if(!$committed)
        {
            //Commit Failed, take appropriate action
        }
        else
        {
            echo "Successful Insert.";
        }
    }
    

    或者,对于 PDO 的使用,请参阅 PDO try-catch usage in functions

    【讨论】:

    • 不要过度使用@操作符。这使得调试非常困难。而是将 display_errors 设置为 off 并将错误记录到日志文件中。而且您没有检查提交是否成功...
    【解决方案2】:

    通常,如果事务失败,您应该期望从数据库返回错误,就像您尝试执行单个 duff 查询一样。

    请注意,并非所有 MySQL 表类型都支持事务。

    【讨论】:

      【解决方案3】:

      每次执行 SQL 后,检查数据库是否返回错误。使用http://www.php.net/manual/en/function.mysql-errno.php 检查错误。

      数据库可能随时返回错误,无论如何都应该检查每个 SQL...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 2018-09-26
        • 2019-05-29
        • 2013-01-15
        • 2014-08-29
        • 1970-01-01
        • 2012-01-24
        相关资源
        最近更新 更多