代码之家  ›  专栏  ›  技术社区  ›  Gunnlaugur Briem

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

  •  15
  • Gunnlaugur Briem  · 技术社区  · 15 年前

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

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

    我见过有人指出 v$transaction 在甲骨文中也是如此(参见 this SO question )我想找一些类似的东西用在PostgreSQL上。

    3 回复  |  直到 7 年前
        1
  •  9
  •   Kuberchaun    15 年前
        2
  •  3
  •   shaunc    7 年前

    请考虑以下语句序列:

    select txid_current();
    
    begin;
    
    select txid_current();
    

    如果两个select返回的事务id相等,则存在未结事务。如果不是,那就没有了(但现在是)。

    如果数字不同,那么作为一个副作用,您将只打开了一个事务,您可能想关闭它。

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

        3
  •  0
  •   Magnus Hagander    15 年前

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

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