【问题标题】:Rollback after error in transaction事务错误后回滚
【发布时间】:2013-04-04 15:19:49
【问题描述】:

这对于熟悉 Postgresql 的人来说应该很容易:

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

(我无论如何都要回滚的原因:以防发生与 SQL 操作无关的异常。)

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如果发生错误,PostgreSQL 并不会真正回滚事务。它使每个后续语句都失败并出现错误。你可以在客户端试试这个。

    您需要执行回滚才能成功执行任何语句。

    如果您关闭连接并启动一个新连接,这没什么大不了的。但是,如果您保留连接并运行您希望成功执行的其他语句,它将无法正常工作。

    【讨论】:

    • 所以,看来我的假设是错误的,但无论如何我回滚是对的。谢谢!
    • @JonSmark 正确。 Pg 将事务标记为已中止,但在您发出回滚之前不会返回到自动提交模式或打开新事务。这样做的原因是,否则你可能会遇到像INSERT INTO historytable SELECT * FROM maintable; 失败然后下面的TRUNCATE TABLE maintable 成功的讨厌情况。哎哟!
    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多