首先是PDO :: rollBack或__destruct

时间:2013-12-11 18:25:32

标签: php oop pdo transactions destructor

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

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

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

1 个答案:

答案 0 :(得分:4)

当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方法中的查询将被执行,然后立即回滚。