【问题标题】:Which comes first, PDO::rollBack or __destruct首先是 PDO::rollBack 或 __destruct
【发布时间】:2013-12-29 21:27:55
【问题描述】:

当您运行PDO::beginTransaction 时,如果由于任何原因脚本结束并且没有明确提交更改(错误、异常、exit/die 等),事务将被回滚。

同样,当脚本结束时,任何对象中存在的任何__destruct 方法都将同样被执行。

所以我的问题是,如果脚本结束并且有一个未完成的数据库事务,它首先被调用,PDO::rollBack 还是 __destruct 方法?

【问题讨论】:

    标签: php oop pdo transactions destructor


    【解决方案1】:

    当 PHP 脚本结束并且存在未完成的 PDO 事务时,PHP 根本不会调用 PDO::rollBack,而是在 PHP 关闭与服务器,这发生在任何destructorsshutdown functions 被执行之后。

    因此,如果我们有以下情况:

    $dbh = get_dbh();
    
    class Test
    {
        public function __construct(PDO $dbh)
        {
            $this->_dbh = $dbh;
        }
    
        public function __destruct()
        {
            $stmt = $this->_dbh->prepare("
                UPDATE some_table
                SET some_column = :val");
            $stmt->bindValue('val', time());
            $stmt->execute();
        }
    }
    
    $test = new Test($dbh);
    
    $dbh->beginTransaction();
    
    // End of file
    

    __destruct方法中的查询将被执行,然后立即回滚。

    【讨论】:

    • 令人惊讶的是,使用 google 很难找到一个明确的声明,即如果 PHP 在事务正在进行时退出,则更改将被回滚,就像调用了 $dbh->rollback() 一样。我想这是因为我搜索的是 PHP 和 PDO,而它实际上是数据库的一个属性,当启动事务的连接关闭时!
    猜你喜欢
    • 2018-05-04
    • 2014-09-30
    • 2017-04-03
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多