jueves, 16 de febrero de 2012

ORACLE-DBA: desbloquear transacciones pendientes.

Cuando se intenta realizar una operación sobre una tabla (insert, update, delete) y por alguna razón, la transacción queda pendiente, se debe identificar esta transacción y proceder a matar la sesión que la origina para poder liberar la tabla y proceder nuevamente a realizar la operación sobre ella.

Las transacciones se registran en la tabla dba_locks:

SQL> select * from dba_locks;

SESSION_ID LOCK_TYPE      MODE_HELD       MODE_REQUESTED LOCK_ID1 LOCK_ID2  LAST_CONVERT BLOCKING_OTHERS
---------- -------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ------------ ----------------------------------------
       552 Media Recovery      Share       None 201 0       4418031 Not Blocking
       530 DML      Row-X (SX)       None 12723 0  7170 Not Blocking
       530 Transaction      Exclusive       None 196634 19744  7170 Not Blocking

Donde la columna LOCK_TYPE la que indica el tipo de bloqueo, siendo el que nos interesa el del tipo "transaction"
Para identificar la sesion completa se toma el valor de la columna SESSION_ID y se busca en la tabla v$session:

SQL> select sid,serial#,username,program from v$session where sid=530;

       SID    SERIAL# USERNAME     PROGRAM
---------- ---------- ------------------------------ ------------------------------------------------
       530 1648 TAMP     sqlplus@cch (TNS V1-V3)

Una vez identificados el SID y el serial# se termina con la sesión:
SQL> alter system kill session '530,1648';
System altered.



De esa forma se puede consultar nuevamente en la tabla dba_locks donde el registro de la transacción ya debe haber desaparecido.

2 comentarios: