gravatar

Transacciones dudosas

Pregunta:
Hace un tiempo en una base de datos tenía un link mediante el cual realizaba modificaciones en una base de datos remota, hubo algunos inconvenientes y quedaron algunas transacciones marcadas como dudosas, en su momento realicé un commit force, hasta aca todo bien, aparentemente.
Resulta que, el link ya no existe mas, pero en el log quedo dando un error por cada una de esas transacciones pendientes.
ERROR, tran=7.28.375837, session#=1, ose=0:
ORA-02019: connection description for remote database not found

En PENDING_TRANS$, PENDING_SESSIONS$ y PENDING_SUB_SESSIONS$ tengo 19 registros en cada tabla. En la columna STATUS figura una C, y en la descripcion del estado dice FORCED COMMIT.

La pregunta es ¿Como se puede forzar el estado de estas transacciones para que no siga intentando conectarse a un link que ya no existe mas?
¿hay alguna forma?

Respuesta:

Hace tiempo teníamos 10 BDs en replica, cada una estaba ubicada en distintos
centros y a veces, por problemas de conexión, se nos quedaban pendientes
transacciones, y como bien dices, forzábamos el commit o rollback, según.

Había casos en los que las transacciones seguían apareciendo, y existe una
forma de eliminar estas transacciones, para ello hay un procedimiento en
Metalink (Note:1012842.102) que resumiendo, los pasos son:

SQL> select LOCAL_TRAN_ID,STATE from dba_2pc_pending;

LOCAL_TRAN_ID STATE
---------------------- ----------------
37.16.108 prepared

SQL> rollback force '37.16.108'; ==>For example

Rollback complete.

SQL> select LOCAL_TRAN_ID,STATE from dba_2pc_pending;

LOCAL_TRAN_ID STATE
---------------------- ----------------
37.16.108 forced rollback

SQL>Commit;

SQL>alter session set "_smu_debug_mode" = 4;
Rollback complete.

SQL> exec dbms_transaction.purge_lost_db_entry('37.16.108'); ==>For example