PDO :: commit()成功或失败

时间:2014-05-25 02:06:41

标签: 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();

如果上述任何一次执行失败,commit()方法会因为"全有或全无基础而返回false。原子交易?

3 个答案:

答案 0 :(得分:6)

关键部分是在异常模式下设置PDO ,而只有try-catch才能进行回滚是不必要的。因此,你的代码是正确的,如果你想要的只是在某个地方有这条线,你就不需要改变它了:

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 

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

如果您仍想手动回滚,则应该正确执行此操作,而不是像其他答案中所说的那样。确保

  • 您正在抓住Exception,而不是PDOException,因为特定异常导致执行失败并不重要
  • 您在回滚后重新投掷异常,以获得问题通知
  • 还有一个表引擎支持事务(即对于Mysql,它应该是InnoDB,而不是MyISAM)。

此清单取自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会失败应用程序应该抛出异常并且提交甚至不会触发。