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