如何检查PostgreSQL事务中的挂起操作

问题描述 投票:15回答:3

我在PostgreSQL上有一个会话(SQLAlchemy),有一个活动的未提交事务。我刚刚通过INSERT或直接通过底层连接将一个调用树传递给了一些调用树,该调用树可能已经或可能没有发出SQL UPDATE / DELETE / sqlalchemy.orm语句。

有没有办法检查此事务中是否有任何待处理的数据修改语句?即是否提交将是无操作,以及回滚是否会丢弃某些东西?

我见过人们在Oracle中指出v$transaction也是如此(参见this SO question)。我正在寻找类似于在PostgreSQL上使用的东西。

postgresql transactions sqlalchemy
3个回答
9
投票

3
投票

请考虑以下语句序列:

select txid_current();

begin;

select txid_current();

如果两个选择返回的事务id相等,则存在打开的事务。如果没有,则没有,(但现在是)。

如果数字不同,那么作为副作用,您将打开一个您可能想要关闭的交易。

更新:事实上,正如@ r2evans指出的那样(感谢洞察力!),您不需要“开始” - txid_current()将返回相同的数字,就在您进行交易时。


0
投票

不,不是来自数据库级别,真的。也许您可以在sqlalchemy级别添加一些跟踪来跟踪它?

另外,你如何定义无操作?如果您将某个值更新为之前的相同值,那该怎么办呢?从数据库的角度来看,如果它有一个,它就不会是无操作。但从应用程序的角度来看,它可能会。

© www.soinside.com 2019 - 2024. All rights reserved.