首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL --如何确定事务是否是活动的?

PostgreSQL --如何确定事务是否是活动的?
EN

Stack Overflow用户
提问于 2018-07-28 01:21:27
回答 3查看 2.5K关注 0票数 5

让我首先说:是的,我知道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 (尽管我并不真正关心事务嵌套的深度.)

EN

回答 3

Stack Overflow用户

发布于 2018-07-28 07:02:10

Postgres在事务中运行PL/pgSQL。因此,您无法从PL/pgSQL内部控制事务。代码将类似于:

代码语言:javascript
运行
复制
begin;
  select plpgsql_fn();
  do '/*same any plpgsql*/';
end;

所以回答你的问题:

如果你有PL/pgSQL运行自动取款机,你的交易活动自动取款机.

当然,您可以做一些技巧,比如在dblink或其他方面开始/结束工作。但是你可以成功地在select txid_current();上检查dblink .

票数 0
EN

Stack Overflow用户

发布于 2018-07-29 09:15:24

如果您想确定您的事务中是否有任何数据修改,请调用txid_current_if_assigned()。如果尚未修改任何内容,则返回NULL。

如果你只想知道你是否在某个事务中,你可以省去麻烦,因为你总是这样。

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

票数 0
EN

Stack Overflow用户

发布于 2022-07-05 09:26:03

我还没有找到一种干净的方法来做到这一点,但是您可以始终调用BEGIN,如果它成功了,就意味着没有正在进行的事务(不要忘记回滚)。如果它在“已经在进行中的事务”中失败,这意味着您在事务中(最好不要回滚)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51567264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档