現在のセッションにコミットされていないINSERT、UPDATE、またはDELETEステートメントがあるかどうかを確認する方法を探しています。 1つの方法は、現在の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
こちらもご覧ください...
以下のクエリを使用して、保留中のトランザクションを見つけます。
値を返す場合、保留中のトランザクションがあることを意味します。
クエリは次のとおりです。
select dbms_transaction.step_id from dual
;
参照:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.htmlhttp://www.acehints .com/p/site-map.html
最も簡単で信頼性の高いソリューションは、トランザクションを試行して開始し、成功したかどうかを確認することです。一部のコードが既にトランザクションを開始しているが、まだ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;
/
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;