PDO :: commit()成功或失败

Ben*_*est 8 php mysql pdo transactions

PHP PDO :: commit()文档声明该方法在成功时返回TRUE,在失败时返回FALSE.这是指beginTransaction()和commit()之间语句执行的成功还是失败?

例如,从文档中:

$dbh->beginTransaction();
$sql = 'INSERT INTO fruit (name, colour, calories) VALUES (?, ?, ?)';
$sth = $dbh->prepare($sql);

foreach ($fruits as $fruit) {
    $sth->execute([
        $fruit->name,
        $fruit->colour,
        $fruit->calories,
    ]);
}

$dbh->commit();
Run Code Online (Sandbox Code Playgroud)

如果上述任何执行失败,由于原子事务的"全有或全无"基础,commit()方法是否会返回false?

dn *_*Fer 6

返回值基于 pdo::commit 本身,而不是您尝试提交的事务。当没有事务处于活动状态时,它会返回 FALSE,但何时应该返回 TRUE 或 FALSE 并不太清楚。

事务本身内执行的查询将自行成功或失败。使用 Mr.Tk 的示例,如果可能并且在“try”块中执行查询时没有发生错误,则将提交事务;如果“try”块中确实发生错误,则将回滚事务。

当仅评估“try”块中执行的查询时,我个人会尝试捕获 PDOException 而不是普通的异常。

$dbh->beginTransaction();
try {
    // insert/update query
    $dbh->commit();
} catch (PDOException $e) {
    $dbh->rollBack();
}
Run Code Online (Sandbox Code Playgroud)


You*_*nse 6

关键部分是将PDO设置为异常模式,而不必使用try-catch来执行回滚.因此,您的代码是正确的,如果您想要的只是在某个地方有这条线路,则无需更改它:

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
Run Code Online (Sandbox Code Playgroud)

如果失败,脚本将被终止,连接关闭,mysql将很乐意为您回滚事务.

如果你仍然想手动回滚,你应该正确地做,不像在其他答案中说的那样.确保这一点

  • 你抓住了Exception,不是PDOException,因为什么特殊的异常中止了执行并不重要
  • 您在回滚后重新抛出异常,以获得问题通知
  • 还有一个表引擎支持事务(即对于Mysql,它应该是InnoDB,而不是MyISAM).

这份清单来自我的文章,你可能会发现这个或许多其他方面都有用.