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();
如果上述任何一次执行失败,commit()方法会因为"全有或全无基础而返回false。原子交易?
答案 0 :(得分:6)
关键部分是在异常模式下设置PDO ,而只有try-catch才能进行回滚是不必要的。因此,你的代码是正确的,如果你想要的只是在某个地方有这条线,你就不需要改变它了:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
如果失败,脚本将被终止,连接关闭,mysql将很乐意为您回滚事务。
如果您仍想手动回滚,则应该正确执行此操作,而不是像其他答案中所说的那样。确保
Exception
,而不是PDOException
,因为特定异常导致执行失败并不重要此清单取自my article,您可能会发现这个或许多其他方面也很有用。
答案 1 :(得分:3)
返回值基于pdo :: commit本身,而不是您尝试提交的事务。 当没有事务处于活动状态时它返回FALSE,但是当它应该返回TRUE或FALSE时它不是很清楚。
事务本身内执行的查询将成功或失败。 使用Mr.Tk的示例,如果可能,事务将被提交,并且在“try”块中执行查询时不会发生错误,并且如果在“try”块中发生错误则回滚。
当只评估“try”块中执行的查询时,我个人会尝试捕获PDOException而不是正常的Exception。
$dbh->beginTransaction();
try {
// insert/update query
$dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
}
答案 2 :(得分:0)
我总是那样做:
$dbh->beginTransaction();
try {
// insert/update query
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
}
始终充当魅力! :)
所以我认为在你的情况下如果insert会失败应用程序应该抛出异常并且提交甚至不会触发。