【问题标题】:Postgresql: rolling back to savepoint if it existsPostgresql:如果存在,则回滚到保存点
【发布时间】:2021-01-18 14:56:34
【问题描述】:

处理 DAL 类型的系统时,我遇到了保存点安全问题:在进程开始时创建保存点,并在成功完成时释放或在错误时回滚。

但是,虽然这是不正常的,但整个事务可能会被正在运行的进程提交(或回滚)。这将删除我们试图释放/回滚的保存点。这个问题可以通过在发布/回滚周围放置另一个保存点来解决,但显然不可能SAVEPOINT 一个事务出错。

有没有办法尽最大努力对此进行处理,以便保存点在存在时被释放/回滚,否则不会发生任何事情?根据In Postgres, how to get a list of current defined savepoint? 的说法,当时没有办法 LBYL,现在似乎也没有办法了。

【问题讨论】:

  • 我没看明白:如果事务结束,设置保存点是没有意义的。您可以在函数结束时释放保存点并捕获错误。
  • @LaurenzAlbe 问题是事务可能会或可能不会结束,我正在工作的层对此一无所知,因为这取决于它触发的过程有多糟糕。 tx 不应结束,但系统应该能够处理该状态。 & 释放不存在的保存点意味着如果当前事务不存在,则将其置于错误中。
  • 那为什么不在开始新事务后立即创建保存点呢?
  • 因为目标是释放或回滚现有的保存点,如果它仍然存在。
  • 如果你在BEGIN之后创建它,它会一直存在,所以你可以无条件释放它。

标签: postgresql savepoints


【解决方案1】:

您可以尝试使用 pg_xlogdump,将结果批量复制到表中,然后读取该表以找到那些命令...

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2016-01-18
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多