在事务中出错后回滚

Jon*_*ark 6 postgresql

对于那些熟悉Postgresql的人来说,这应该是一个简单的方法:

我的应用程序发出一个begin_work,做了一些操作,然后发出一个commit.操作和提交包含在try-catch块中,其catch语句执行rollback.假设:如果在SQL操作期间发生错误,Postgresql将自动回滚事务,因此我的回滚将是多余的,无害.这个假设是否正确?

(无论如何我还是要回滚的原因:以防万一与SQL操作无关的异常.)

dro*_*.ah 4

如果发生错误,PostgreSQL 实际上不会回滚事务。它会导致所有后续语句失败并出现错误。您可以在客户端中尝试一下。

任何语句执行成功之前都需要执行回滚。

如果您关闭连接并启动新连接,则影响不大。但是,如果保留连接并运行其他希望成功执行的语句,则它将不起作用。

  • @JonSmark 正确。Pg 将事务标记为已中止,但不会返回到自动提交模式或打开新事务,直到您发出回滚。原因是,否则您可能会遇到诸如“INSERT INTO Historytable SELECT * FROM maintable;”之类的令人讨厌的情况,而随后“TRUNCATE TABLE maintable”会成功。哎哟! (2认同)