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;
SELECCIONAR * DE V $ TRANSACCIÓN DONDE ESTADO = ''ACTIVO'';
Ver: http://forums.oracle.com/forums/thread.jspa?threadID=691061
Use la consulta a continuación para averiguar la transacción pendiente.
Si devuelve un valor, significa que hay una transacción pendiente.
Aquí está la consulta:
select dbms_transaction.step_id from dual
;
Referencias
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.html http://www.acehints.com/p/site-map.html
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