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

时间:2009-10-30 17:26:54

标签: postgresql transactions sqlalchemy

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

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

我看到人们在Oracle中指出v$transaction同样的事情(参见this SO question)。我正在寻找类似于在PostgreSQL上使用的东西。

3 个答案:

答案 0 :(得分:9)

答案 1 :(得分:3)

考虑以下语句序列:

select txid_current();

begin;

select txid_current();

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

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

更新:事实上,正如@ r2evans指出的那样(感谢您的见解!),您不需要"开始" - 只要您处于交易中,txid_current()将返回相同的数字。

答案 2 :(得分:0)

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

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