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;