ORA-01591 bloqueo transacción distribuida

Es posible que una aplicación muestre en su log un error ORA-01591, que según la documentación oficial es debido a una trasacción de 2 fases que no puede completarse.

Este tipo de transacciones se usan, por ejemplo, cuando se hace un commit usando tablas obtenidas a partir de un dblink. Se verifica que se puede hacer un commit en remoto, otro en local y finalmente se hace en los 2 sitios de forma atómica.

Bueno pues cuando se pierde la conexión con un dblink durante una transacción, la transacción queda en un estado dudoso y si alguna otra sesión intenta modificar los objetos involucrados veremos el error ORA-01591.

El problema real es un bloqueo mantenido sobre un objeto, que para detectarlo y hacer un roolback con él hay que hacer:

1- Localizar las transacciones pendientes, esto se puede hacer con la consulta:

Source   
SELECT * FROM pending_trans$

o

Source   
SELECT * FROM DBA_2PC_PENDING

Estas consultas incluyen el campo STATE que si es igual a «Prepared», es muy posible que sea la transacción que nos esté dando problemas, tomamos el valor del campo «LOCAL_TRAN_ID’.

2- Cancelación de la transacción con (donde ‘LOCAL_TRAN_ID’ se ha obtenido en el paso anterior):

Source   
ROLLBACK FORCE 'LOCAL_TRAN_ID';

o

Source   
execute dbms_transaction.rollback_force('LOCAL_TRAN_ID');

3- Eliminación de entradas en el diccionario, es decir eliminar la entrada de las tablas que hemos consultado:

Source   
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('LOCAL_TRAN_ID');

Y problema solucionado.

8 thoughts on “ORA-01591 bloqueo transacción distribuida

Deja un comentario