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:
SELECT * FROM pending_trans$
o
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):
ROLLBACK FORCE 'LOCAL_TRAN_ID';
o
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:
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('LOCAL_TRAN_ID');
Y problema solucionado.
Exelente aporte, funciona al 100%
Gracias…..
de mucha ayuda. mil gracias
Excelente aporte me saco de problemas. Gracias.
No hay de que…
Exelente contribucion, me funciono de maravilla
Gracias.
super post, me sacaste de un apuro!!! saludos y gracias!!
Funcionó perfecto… gracias!!