【发布时间】: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