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

我正在寻找一种方法来确定在当前会话中是否存在uncommited INSERT,UPDATE或DELETE语句。 一种方法是使用当前的sid来检查v $ lock,但这需要对v $ lock进行读取访问,如果DBA不想授予它,那么这是一个问题。 除了跟踪应用程序发出的所有数据库命令外,还有其他的方式吗?

你可以检查你的会话是否在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 

这是我通常使用的查询,

 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; 

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

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

另见…

我如何知道在Oracle事务中是否有未提交的工作?

使用下面的查询来找出待处理的事务。

如果它返回一个值,这意味着有一个挂起的事务。

这是查询:

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

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;