【发布时间】:2016-10-23 11:56:45
【问题描述】:
如果引发数据库异常,PDO 的 inTransaction() 在仍在事务中时返回 false。这可能特定于使用 PostgreSQL。例如
try {
$pdo->beginTransaction();
$pdo->exec('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
// ...
// Cause any PDO exception
// ...
$pdo->commit();
} catch (\Exception $e) {
if ($pdo->inTransaction()) {
// Never gets here
$pdo->rollback();
}
throw $e;
}
事务肯定没有结束,因为如果我开始另一个事务,我会得到一个异常,表明事务已经在进行中。我还没有测试过所有类型的异常,但是SQLSTATE[40001]: Serialization failure 和主键违规肯定会发生这种情况。 这是预期的行为还是 PHP 中的错误?
似乎知道回滚的唯一方法是保留一个单独的变量来知道我在事务中,使inTransaction() 无用。我注意到一些开源框架(如Doctrine)和应用程序(如Drupal)为事务状态保留了自己的变量。 为什么我们不能依靠驱动程序或数据库来告诉我们事务是否正在进行?
PHP 5.5.32 和 PostgreSQL 9.4。找到了一个两年前的相关bug report,它在旧版本的 PHP 中已关闭。
【问题讨论】:
-
查看stackoverflow.com/questions/22743357/…的答案.....从表面上看,“问题”是PostgreSQL而不是PHP,你所看到的是正常的。
标签: php postgresql pdo transactions