[ 2017-10-03 ]

Obteniendo un "transaction ID" en nuestra propia sesión

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.
Para obtener este identificador, vamos a utilizar el procedure
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