PostgreSQL-如何确定交易是否活跃?

时间:2018-07-28 01:21:28

标签: postgresql transactions plpgsql

让我开放地说:是的,我知道Determine if a transaction is active (Postgres)

不幸的是,该问题的唯一答案过于具体于所提供的用例,并且实际上并未指示事务是否处于活动状态。

How to check for pending operations in a PostgreSQL transaction建议的select txid_current();技巧似乎不起作用-我总是从对该函数的相邻调用中获得相同的事务ID。可能是因为我正在尝试从pgAdmin进行测试,而pgAdmin透明地开始了交易...? (注意:我实际上并不在乎是否有任何挂起的更改或活动锁,因此查看pg_locks并没有帮助-如果自事务开始以来什么都没碰到怎么办?)

因此:如何确定PostgreSQL当前是否处于活动状态?

一个可能用例是:有问题的SP / FN将执行其自己的显式事务管理,而在已经激活的事务中调用它会极大地干扰这一点。我想提出一个错误,以便可以纠正在事务中调用此SP / FN的编码错误。

不过,还有其他用例。

理想情况下,我要寻找的是与MSSQL的@@TRANCOUNT等效的(尽管我并不在乎交易的嵌套深度 ...)

2 个答案:

答案 0 :(得分:0)

Postgres在事务内部运行PL/pgSQL。因此,您无法从PL/pgSQL内部控制交易。代码如下:

begin;
  select plpgsql_fn();
  do '/*same any plpgsql*/';
end;

所以回答您的问题:

如果您有PL/pgSQL正在运行ATM,则您的交易活动ATM ...

您当然可以做一些技巧,例如通过dblink开始/结束工作等。但是您可以成功检查select txid_current();上的dblink ...

答案 1 :(得分:0)

如果要确定事务中是否有任何数据修改,请致电txid_current_if_assigned()。如果尚未进行任何修改,它将返回NULL。

如果您只想知道自己是否在某笔交易中,则可以省去麻烦,因为您总是

在PostgreSQL v11之前,您不能在函数中使用事务控制语句。