让我首先说:是的,我知道Determine if a transaction is active (Postgres)
不幸的是,对这个问题的唯一答案对于所提供的用例来说过于具体,并且实际上并没有指明一个事务是否是活动的。
由select txid_current();建议的How to check for pending operations in a PostgreSQL transaction技巧似乎不起作用-我总是从相邻的函数调用中获得相同的事务ID。这可能是因为我试图从pgAdmin中测试它,它透明地启动事务.?(注意:我实际上并不关心是否有任何挂起的更改或活动锁,因此查看pg_locks是没有帮助的-如果自事务启动以来没有任何东西被碰过怎么办?)
因此:如何在PostgreSQL PL/pgSQL代码中确定一个事务当前处于活动状态?
一个可能的用例是:所讨论的SP/FN将执行它自己的显式事务管理,并且使用已经处于活动状态的事务调用它将极大地干扰这一点。我想引发一个错误,以便能够纠正在事务中调用这个SP/FN的编码错误。
不过,还有其他用例。
理想情况下,我要寻找的是相当于MSSQL的@@TRANCOUNT (尽管我并不真正关心事务嵌套的深度.)
发布于 2018-07-28 07:02:10
Postgres在事务中运行PL/pgSQL。因此,您无法从PL/pgSQL内部控制事务。代码将类似于:
begin;
select plpgsql_fn();
do '/*same any plpgsql*/';
end;所以回答你的问题:
如果你有PL/pgSQL运行自动取款机,你的交易活动自动取款机.
当然,您可以做一些技巧,比如在dblink或其他方面开始/结束工作。但是你可以成功地在select txid_current();上检查dblink .
发布于 2018-07-29 09:15:24
如果您想确定您的事务中是否有任何数据修改,请调用txid_current_if_assigned()。如果尚未修改任何内容,则返回NULL。
如果你只想知道你是否在某个事务中,你可以省去麻烦,因为你总是这样。
在PostgreSQL v11之前,不能在函数中使用事务控制语句。
发布于 2022-07-05 09:26:03
我还没有找到一种干净的方法来做到这一点,但是您可以始终调用BEGIN,如果它成功了,就意味着没有正在进行的事务(不要忘记回滚)。如果它在“已经在进行中的事务”中失败,这意味着您在事务中(最好不要回滚)。
https://stackoverflow.com/questions/51567264
复制相似问题