En el siguiente post vamos a ver como obtener el ID de una transacción(XID) activa en nuestra propia sessión en la base de datos.
El "Transaction ID"(XID) esta conformado por los siguientes datos: - nro. de Undo Segment
- nro. de Slot
- nro. de SEQ.
local_transaction_id del package dbms_transaction (dbms_transaction.local_transaction_id)
Voy a ejemplificar el uso de este procedimiento utilizando una tabla creada para el caso, llamada T1, sobre la cual luego voy a abrir una transacción (insert).
SQL> create table t1 (c1 number, c2 varchar2(20));
Table created
Una vez creada la tabla, podemos verificar si hay transacciones activas utilizando el procedure. Vemos que aún no hay ninguna en nuestra sesión:
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------------------------------------------------
Ahora iniciamos una transacción ejecutando un "insert" sobre la tabla:
SQL> insert into t1 values (10,'Juan');
1 row inserted
Volvemos a comprobar, y ahora si vemos una transacción. Su ID es 6.12.117773:
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------------------------------------------------
6.12.117773
Nota: Para las siguientes dos consultas necesitamos permisos en las vistas: v$session y v$transaction.
Con la query que sigue también podemos ver las transacciones activas:
SQL> select count(*) from v$transaction;
COUNT(*)
----------
1
Obtenemos también el SID y SERIAL# de nuestra propia sesión:
SQL> select sid, serial#
2 from v$session
3 where sid=SYS_CONTEXT('USERENV','SID')
4 ;
SID SERIAL#
---------- ----------
209 18251
Con la siguiente consulta podemos ver la relación entre la transacción y la sesión:
SQL> col username format a12
SQL> select s.username, s.sid, s.serial#,
2 t.xidusn, t.xidslot, t.xidsqn
3 from v$session s, v$transaction t
4 where s.taddr=t.addr
5 /
USERNAME SID SERIAL# XIDUSN XIDSLOT XIDSQN
------------ ---------- ---------- ---------- ---------- ----------
USER1 209 18251 6 12 117773
SQL> select s.username, s.sid, s.serial#, t.xidusn||'.'||t.xidslot||'.'||t.xidsqn "XID", t.start_time, t.status "TX_STAT", s.status "SES_STAT"
2 from v$session s, v$transaction t
3 where s.taddr=t.addr
4 /
USERNAME SID SERIAL# XID START_TIME TX_STAT SES_STAT
------------ ---------- ---------- ---------------- -------------------- ---------------- --------
USER1 209 18251 6.12.117773 10/03/17 17:20:50 ACTIVE ACTIVE
Finalmente realizamos el rollback de la transacción y verificamos que ya no esté activa:
SQL> rollback;
Rollback complete
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
SQL> select s.username, s.sid, s.serial#,
2 t.xidusn, t.xidslot, t.xidsqn
3 from v$session s, v$transaction t
4 where s.taddr=t.addr
5 /
USERNAME SID SERIAL# XIDUSN XIDSLOT XIDSQN
------------ ---------- ---------- ---------- ---------- ----------
No hay comentarios:
Publicar un comentario