在事务出错后回滚

6
这对于熟悉Postgresql的人来说应该很简单:
我的应用程序发出一个begin_work,执行多个操作,然后发出一个commit。这些操作和提交被包装在一个try-catch块中,其中catch语句执行一个rollback。假设:如果在SQL操作期间出现错误,Postgresql将自动回滚事务,因此我的回滚将是冗余的无害的。这个假设正确吗?
(我仍然回滚的原因是:以防与SQL操作无关的异常出现。)
1个回答

4

如果出现错误,PostgreSQL实际上不会回滚事务。它会在每个后续语句中失败并显示错误。您可以在客户端中尝试此操作。

在能够成功执行任何语句之前,您需要执行回滚操作。

如果您关闭连接并启动新连接,则这没有什么影响。但是,如果您保留连接并运行其他语句,并希望它们能够成功执行,则将无法正常工作。


所以,看来我的假设是错误的,但我还是对回滚操作正确。谢谢! - Jon Smark
2
@JonSmark 正确。Pg将事务标记为已中止,但不会返回到自动提交模式或打开新事务,直到您发出回滚命令。这样做的原因是,否则您可能会遇到像“INSERT INTO historytable SELECT * FROM maintable;”失败,然后以下“TRUNCATE TABLE maintable”成功的恶劣情况。哎呀! - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接