Oracle:如何确定是否有待处理的事务?

时间:2009-08-19 12:45:07

标签: oracle transactions

我正在寻找一种方法来确定当前会话中是否存在未提及的INSERT,UPDATE或DELETE语句。一种方法是使用当前sid检查v $ lock,但这需要对v $ lock的读访问权限,如果DBA不想授予它,这将是一个问题。任何其他方式(除了跟踪应用程序发出的所有数据库命令)?

7 个答案:

答案 0 :(得分:38)

您可以检查您的会话是否在V$TRANSACTION中有一行(显然需要对此视图具有读取权限):

SQL> SELECT COUNT(*)
  2    FROM v$transaction t, v$session s, v$mystat m
  3   WHERE t.ses_addr = s.saddr
  4     AND s.sid = m.sid
  5     AND ROWNUM = 1;

  COUNT(*)
----------
         0

SQL> insert into a values (1);

1 row inserted

SQL> SELECT COUNT(*)
  2    FROM v$transaction t, v$session s, v$mystat m
  3   WHERE t.ses_addr = s.saddr
  4     AND s.sid = m.sid
  5     AND ROWNUM = 1;

  COUNT(*)
----------
         1

SQL> commit;

Commit complete

SQL> SELECT COUNT(*)
  2    FROM v$transaction t, v$session s, v$mystat m
  3   WHERE t.ses_addr = s.saddr
  4     AND s.sid = m.sid
  5     AND ROWNUM = 1;

  COUNT(*)
----------
         0

答案 1 :(得分:29)

这是我通常使用的查询,

select s.sid
      ,s.serial#
      ,s.username
      ,s.machine
      ,s.status
      ,s.lockwait
      ,t.used_ublk
      ,t.used_urec
      ,t.start_time
from v$transaction t
inner join v$session s on t.addr = s.taddr;

答案 2 :(得分:8)

SELECT * FROM V$TRANSACTION
WHERE STATUS='ACTIVE';

请参阅: http://forums.oracle.com/forums/thread.jspa?threadID=691061

答案 3 :(得分:4)

答案 4 :(得分:3)

使用以下查询查找待处理的交易。

如果它返回一个值,则表示存在待处理的事务。

以下是查询:

select dbms_transaction.step_id from dual;

参考文献:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.html http://www.acehints.com/p/site-map.html

答案 5 :(得分:1)

最简单,最可靠的解决方案是尝试启动事务并在成功时查看它。如果某些代码已经开始交易但尚未发布任何DML,则V $ TRANSACTION视图不会显示任何内容。

在下面的示例中,我处理异常以引发用户定义的应用程序错误。要遵循现有的异常处理程序,只需执行SET TRANSACTION,然后立即执行COMMIT以撤消它。

DECLARE
    transaction_in_progress EXCEPTION;
    PRAGMA EXCEPTION_INIT(transaction_in_progress, -1453);
BEGIN
    SET TRANSACTION NAME 'CHECK_FOR_TRANSACTION_ALREADY_SET';
    COMMIT; -- end transaction
EXCEPTION
    WHEN transaction_in_progress THEN
        RAISE_APPLICATION_ERROR(-20000,'Transaction is already in progress');
END;
/

答案 6 :(得分:0)

Matthew Watson可以修改为在RAC中使用

select t.inst_id 
       ,s.sid
      ,s.serial#
      ,s.username
      ,s.machine
      ,s.status
      ,s.lockwait
      ,t.used_ublk
      ,t.used_urec
      ,t.start_time
from gv$transaction t
inner join gv$session s on t.addr = s.taddr;