transaction tran begin oracle transactions

begin - set transaction oracle pl sql



Oracle: ¿cómo saber si hay una transacción pendiente? (7)

Esta es la consulta que normalmente uso,

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;

Estoy buscando una forma de averiguar si hay sentencias INSERT, UPDATE o DELETE sin compromiso en la sesión actual. Una forma sería verificar v $ lock con el sid actual, pero eso requiere acceso de lectura a v $ lock, que es un problema si el DBA no desea otorgarlo. ¿Alguna otra forma (aparte de hacer un seguimiento de todos los comandos de base de datos emitidos por la aplicación)?


La solución más fácil y confiable es intentar iniciar una transacción y verla si tiene éxito. Si algún código ya inició una transacción pero aún no ha emitido ningún archivo DML, entonces la vista V $ TRANSACTION no mostrará nada.

En este ejemplo a continuación, manejo la excepción para generar un error de aplicación definido por el usuario. Para diferir a un manejador de excepciones existente, simplemente realice una TRANSACCIÓN CONJUNTA y luego COMIENCE de inmediato para deshacerla.

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 puede ser modificado para ser utilizado en 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;





puede verificar si su sesión tiene una fila en V$TRANSACTION (obviamente eso requiere privilegio de lectura en esta vista):

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