当您运行PDO::beginTransaction
时,如果由于任何原因脚本结束且未明确提交更改(出错,异常,exit
/ die
等),交易将被回滚。
同样,当脚本结束时,同样会执行任何对象中存在的任何__destruct
方法。
所以我的问题是,如果脚本结束并且有一个未完成的数据库事务,首先调用PDO::rollBack
或__destruct
方法?
答案 0 :(得分:4)
当PHP脚本结束并且存在未完成的PDO事务时,PHP根本不会调用PDO::rollBack
,而是在PHP关闭连接后,数据库服务器本身会回滚任何剩余的事务。到服务器,在执行destructors或shutdown 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
方法中的查询将被执行,然后立即回滚。