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

如何检查PostgreSQL事务中的挂起操作,postgresql,transactions,sqlalchemy,Postgresql,Transactions,Sqlalchemy,我在PostgreSQL上有一个会话(SQLAlchemy),有一个活动的未提交事务。我刚刚将会话传递给某个调用树,该调用树可能发出SQLINSERT/UPDATE/DELETE语句,通过sqlalchemy.orm或直接通过底层连接发出 是否有方法检查此事务中是否有任何挂起的数据修改语句?也就是说,commit是否为no-op,rollback是否会丢弃某些内容 我看到有人在Oracle中为同样的事情指出v$transaction(参见)。我正在寻找类似于在PostgreSQL上使用的东西。首

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

是否有方法检查此事务中是否有任何挂起的数据修改语句?也就是说,commit是否为no-op,rollback是否会丢弃某些内容


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

首先检查系统视图pg_锁


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


另外,如何定义无操作?如果您将一个值更新为以前的值,这是不是一个不操作?从数据库的角度来看,如果它有一个,它将不是一个禁止操作。但从应用程序的角度来看,它可能会。

考虑以下语句序列:

select txid_current();

begin;

select txid_current();
如果两个SELECT返回的事务id相等,则存在打开的事务。如果没有,那么就没有(但现在是)

如果数字不同,那么作为一个副作用,您将只打开一个事务,您可能希望关闭该事务


更新:事实上,正如@r2evans所指出的(感谢您的洞察力!),您不需要“开始”-txid_current()将返回相同的数字,只要您在事务中。

当然,冗余写入也会是“无操作”,但我不希望检测到它(成本大于价值)。我只想知道事务是否有写/删除操作,无效与否。我认为PostgreSQL根本没有写/删除操作(相当于Oracle的v$transaction),我接受你的回答,认为这是明智之举。除非事务获得了任何锁,在pg_locks中找不到任何有用的东西。也许您不需要
开始
:如果您连续两次查询
选择txid_current(),如果它们返回的号码与您当前在事务中的号码相同。