如何检查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事务中的挂起操作的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 PostgreSQL 事务中的待处理操作

如何正确终止 dll 中的挂起线程?

七. 多线程编程11.线程的挂起恢复和终止

你应该知道的协程中的挂起转化小技巧

你应该知道的协程中的挂起转化小技巧

Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )