web-dev-qa-db-ja.com

Oracle:保留中のトランザクションがあるかどうかを確認する方法は?

現在のセッションにコミットされていないINSERT、UPDATE、またはDELETEステートメントがあるかどうかを確認する方法を探しています。 1つの方法は、現在のsidでv $ lockをチェックすることですが、これにはv $ lockへの読み取りアクセスが必要です。これは、DBAが許可したくない場合に問題になります。他の方法(アプリケーションによって発行されたすべてのデータベースコマンドを追跡する以外)

31

セッションに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
39
Vincent Malgrat

これは私が通常使用するクエリです。

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;
32
Matthew Watson
SELECT * FROM V$TRANSACTION
WHERE STATUS='ACTIVE';

参照: http://forums.Oracle.com/forums/thread.jspa?threadID=691061

8
Robert Durgin
4
cagcowboy

以下のクエリを使用して、保留中のトランザクションを見つけます。

値を返す場合、保留中のトランザクションがあることを意味します。

クエリは次のとおりです。

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

3
DBA

最も簡単で信頼性の高いソリューションは、トランザクションを試行して開始し、成功したかどうかを確認することです。一部のコードが既にトランザクションを開始しているが、まだ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;
/
1
Peter Nosko

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;
0
Vu Trong Trang