如何检查PostgreSQL事务中的挂起操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查PostgreSQL事务中的挂起操作相关的知识,希望对你有一定的参考价值。
我在PostgreSQL上有一个会话(SQLAlchemy),有一个活动的未提交事务。我刚刚通过INSERT
或直接通过底层连接将一个调用树传递给了一些调用树,该调用树可能已经或可能没有发出SQL UPDATE
/ DELETE
/ sqlalchemy.orm
语句。
有没有办法检查此事务中是否有任何待处理的数据修改语句?即是否提交将是无操作,以及回滚是否会丢弃某些东西?
我见过人们在Oracle中指出v$transaction
也是如此(参见this SO question)。我正在寻找类似于在PostgreSQL上使用的东西。
首先检查系统视图pg_locks。
http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html
请考虑以下语句序列:
select txid_current();
begin;
select txid_current();
如果两个选择返回的事务id相等,则存在打开的事务。如果没有,则没有,(但现在是)。
如果数字不同,那么作为副作用,您将打开一个您可能想要关闭的交易。
更新:事实上,正如@ r2evans指出的那样(感谢洞察力!),您不需要“开始” - txid_current()将返回相同的数字,就在您进行交易时。
不,不是来自数据库级别,真的。也许您可以在sqlalchemy级别添加一些跟踪来跟踪它?
另外,你如何定义无操作?如果您将某个值更新为之前的相同值,那该怎么办呢?从数据库的角度来看,如果它有一个,它就不会是无操作。但从应用程序的角度来看,它可能会。
以上是关于如何检查PostgreSQL事务中的挂起操作的主要内容,如果未能解决你的问题,请参考以下文章