我在PostgreSQL上有一个会话(SQLAlchemy),有一个活动的未提交事务。我刚刚将会话传递给了一些调用树,该调用树可能已经或可能没有通过INSERT
或直接通过底层连接发出SQL UPDATE
/ DELETE
/ sqlalchemy.orm
语句。
有没有办法检查此事务中是否有任何待处理的数据修改语句?即是否提交将是无操作,以及回滚是否会丢弃某些东西?
我看到人们在Oracle中指出v$transaction
同样的事情(参见this SO question)。我正在寻找类似于在PostgreSQL上使用的东西。
答案 0 :(得分:9)
首先检查系统视图pg_locks。
http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html
答案 1 :(得分:3)
考虑以下语句序列:
select txid_current();
begin;
select txid_current();
如果两个选择返回的事务id相等,则存在打开的事务。如果没有,则没有,(但现在是)。
如果数字不同,那么作为副作用,您只需打开一个交易,您可能想要关闭该交易。
更新:事实上,正如@ r2evans指出的那样(感谢您的见解!),您不需要"开始" - 只要您处于交易中,txid_current()将返回相同的数字。
答案 2 :(得分:0)
不,不是来自数据库级别,真的。也许您可以在sqlalchemy级别添加一些跟踪来跟踪它?
另外,你如何定义无操作?如果您将某个值更新为之前的相同值,那该怎么办呢?从数据库的角度来看,如果它有一个,它就不会是无操作。但从应用程序的角度来看,它可能会。