programing

Oracle: 보류 중인 트랜잭션이 있는지 확인하려면 어떻게 해야 합니까?

muds 2023. 3. 22. 22:16
반응형

Oracle: 보류 중인 트랜잭션이 있는지 확인하려면 어떻게 해야 합니까?

현재 세션에서 커밋되지 않은 INSERT, UPDATE 또는 DELETE 스테이트먼트가 있는지 확인할 방법을 찾고 있습니다.v$lock을 현재 sid와 함께 확인하는 것도 한 가지 방법이지만 v$lock에 대한 읽기 액세스 권한이 필요합니다. 이는 DBA가 v$lock을 부여하지 않으려는 경우에 문제가 됩니다.다른 방법(애플리케이션에 의해 실행된 모든 데이터베이스 명령을 추적하는 것 제외)은 없습니까?

세션에 행이 있는지 확인할 수 있습니다.V$TRANSACTION(이 뷰에 대한 읽기 권한이 필요한 경우):

SQL> SELECT COUNT(*)
       FROM v$transaction t, v$session s, v$mystat m
      WHERE t.ses_addr = s.saddr
        AND s.sid = m.sid
        AND ROWNUM = 1;

  COUNT(*)
----------
         0

SQL> insert into a values (1);

1 row inserted

SQL> SELECT COUNT(*)
       FROM v$transaction t, v$session s, v$mystat m
      WHERE t.ses_addr = s.saddr
        AND s.sid = m.sid
        AND ROWNUM = 1;

  COUNT(*)
----------
         1

SQL> commit;

Commit complete

SQL> SELECT COUNT(*)
       FROM v$transaction t, v$session s, v$mystat m
      WHERE t.ses_addr = s.saddr
        AND s.sid = m.sid
        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

또, 이하를 참조해 주세요.

Oracle 트랜잭션에서 커밋되지 않은 작업이 있는지 확인하려면 어떻게 해야 합니까?

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;

가장 쉽고 신뢰할 수 있는 솔루션은 트랜잭션을 시작하고 성공 여부를 확인하는 것입니다.일부 코드가 트랜잭션을 이미 시작했지만 아직 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;
/

언급URL : https://stackoverflow.com/questions/1299694/oracle-how-to-find-out-if-there-is-a-transaction-pending

반응형