【发布时间】:2014-05-09 17:12:09
【问题描述】:
我发现 postgres + PDO auto rollbacks 在抛出异常时会发生变化(即使异常被捕获并吞下!)。示例(伪代码):
$transaction->begin();
try {
$manager->insert("INSERT ...");
try {
$manager->exec("A QUERY BREAKING SOME DB CONSTRAINT LIKE A UNIQUE INDEX ...");
} catch (\Exception $ex) {
// IT IS CAUGHT AND SWALLOWED!
}
$transaction->commit();
} catch (Exception $ex) {
$transaction->rollback(); // THIS CLEARLY DOES NOT RUN!
}
在 postgres 中,第一个插入被还原。在mysql中没有。
谁能解释一下这个问题?有没有可能改变这种荒谬的行为?我想自己执行回滚,而不是让 pg 在他认为合适的时候执行。
【问题讨论】:
-
好吧,经过重新考虑,@samitha 的问题可以用一种非常明智的方式来解释。使用 myisam 引擎,无论是否有回滚,都不会恢复插入。
-
我手头没有亮光,但我有一个友好的建议。创建一个一致且防错的测试用例,而不是充满假设的伪代码草图。
-
@YourCommonSense 它是 innodb(谁再使用 myisam?)
标签: php postgresql pdo