代码之家  ›  专栏  ›  技术社区  ›  Eran

指示事务是否有未提交的更新

  •  5
  • Eran  · 技术社区  · 15 年前

    在我们的应用程序中,只有在执行后续更新之后才会提交数据库更新(当然,这两个更新都使用相同的事务)。但是,我们发现了一个罕见的流程,用户在第二次更新之前退出应用程序,导致第一次更新被丢弃。我正在寻找一种在退出时识别此未提交更新的方法。

    我知道像这样的问题需要重新设计,但那是不可能的。由于流程的稀有性和应用程序的结构,我想知道是否有一种方法可以检查事务本身是否有未提交的更新。

    问题对Oracle和SQLServer有效。这个应用程序是用PowerBuilder编写的,但是如果这很重要的话,它可以以各种方式扩展(.net、win32等)。

    7 回复  |  直到 14 年前
        1
  •  5
  •   Bob Jarvis - Слава Україні    15 年前

    在Oracle中,您可以调用dbms_transaction.local_transaction_id。这将返回当前事务的唯一标识符,或者如果没有活动事务,则返回空值。

    分享和享受。

        2
  •  4
  •   Adriaan Stander    15 年前

    这可能会有帮助

    @@TRANCOUNT (Transact-SQL)

    返回活动的数目 当前交易记录 连接。

        3
  •  2
  •   Terry    15 年前

    如果您使用的是PB11.5并使用自定义事务对象,那么很容易做一些与DBMS无关的事情。在事务对象的sqlpreview事件中,只需在插入、更新或删除经过时打开布尔值,然后在提交或回滚经过时关闭布尔值。

    实际上,如果您使用的是sqlca,那么在自定义事务对象中进行交换并不难:application、properties、additional properties、variable types、sqlca。如果您使用许多单独的数据库连接和许多“create transaction”语句(标准的pb搜索可以找到这个,或者 PBL Peeper 可以帮助您在单词之间使用不同数量的空格来查找它),然后实现它将更加困难,但并非不可能。

    为了完整起见,要创建一个自定义事务对象file/new/pb object/standard class/transaction。您有一个常规的用户对象,您可以在其中定义实例变量(如我建议的布尔值)、脚本事件(如我建议的sqlpreview事件)和函数(您可能希望为该功能创建一个接口,以便在将来扩展它时隐藏详细信息)。注意,sqlpreview在11.5之前的事务对象上不可用。(对于那些认为它在11.5之前听起来很熟悉的人,datawindow实现了一个sqlpreview。)

    祝你好运,

    特里。

        4
  •  1
  •   Community rohancragg    7 年前

    在Oracle中有一个视图 V$TRANSACTION 其中包含每个未提交事务的行。没有从外部看到事务性质的机制(除非您在代码中内置了工具,例如通过使用 DBMS_APPLICATION_INFO.SET_MODULE() )但是,当前会话可以看到它是否有如下未提交的工作:

    SQL> select t.status
      2  from   v$transaction t
      3         join v$session s
      4         on s.saddr = t.ses_addr
      5  where s.sid = sys_context('userenv', 'sid')
      6  /
    
    STATUS
    ----------------
    ACTIVE
    
    SQL>
    

    如果没有未提交的事务,则此查询将返回未找到的数据。默认情况下,V$视图不会授予用户,因为它们实际上是一个dba thang。但是,具有适当特权的用户可以将此查询转换为视图并授予对常规joe的访问权。

    有趣的是,你到底想做什么?假设工作单元定义正确,并且有两个更新,那么只提交一个肯定是错误的。如果您只想知道这个异常终止发生了,那么您需要某种形式的跟踪或日志记录。

    编辑

    鲍勃贾维斯 proposes 使用 DBMS_TRANSACTION.LOCAL_TRANSACTION_ID() . 这是一个比手工制作的视图更好的建议。v$transaction视图还可用于监视来自其他会话的未提交事务。

        5
  •  0
  •   John Sansom    15 年前

    为了方便对您的场景进行故障排除,您可能希望考虑使用显式命名的本地事务,以及使用带有标记__选项的__。这允许您将显式事务的名称记录到事务日志中,当然,您可以在稍后的阶段检查该事务,以确定已发生的事件序列。

    请参阅SQL Server联机丛书: Marked Transactions

        6
  •  0
  •   A-K    15 年前

    在SQL Server中,运行以下命令:

    IF @@TRANCOUNT>0 BEGIN
      ROLLBACK;
    END;
    
        7
  •  0
  •   Chris Burgess    14 年前

    在SQL Server 2005/2008中,可以使用DMV。退房 this article