Una transacción que termina en rollback deshace lo que hizo. A veces eso es esperable, como la rutina de un pool de conexiones; a veces revela trabajo perdido después de un error. El propio trace dice cuál de los dos casos es.
Síntomas
En el Diagnóstico aparece el hallazgo n rollbacks (ROLLBACK), o 1 rollback, con el texto El trabajo deshecho también cuesta tiempo; compruebe si es lo esperado. y el enlace Ver resumen. La gravedad es baja, sin porcentaje del tiempo total.
El hallazgo aparece cuando el trace tiene al menos una línea XCTEND con rlbk=1, que marca el fin de una transacción por rollback. En el Resumen, la tarjeta Sentencias distintas muestra, abajo, cuántos commits y rollbacks hizo la sesión.
Causa
- La aplicación deshace la transacción después de un error.
- El pool de conexiones o el framework hace rollback al devolver la conexión o al final de cada pedido, muchas veces sin haber modificado nada.
- Una rutina simula o prueba una operación y descarta el resultado.
El costo depende de lo que la transacción modificó: la base de datos deshace cada modificación con el undo. Una transacción que solo leyó termina sin nada que deshacer, y su línea XCTEND trae rd_only=1.
Solución
- Compare commits y rollbacks en el Resumen.
- Cuente en el trace los rollbacks de transacciones que modificaron datos (
rd_only=0) y los de transacciones que solo leyeron (rd_only=1):grep -c "XCTEND rlbk=1, rd_only=0" arquivo.trc grep -c "XCTEND rlbk=1, rd_only=1" arquivo.trcResultado: sumados, los dos números dan el total de rollbacks del hallazgo.
- Liste las líneas de los rollbacks que deshicieron modificaciones; el número antes de los dos puntos es la línea del trace:
grep -n "XCTEND rlbk=1, rd_only=0" arquivo.trc | head - Lea el fragmento del trace antes de cada uno. Cambie 1000 por la línea del rollback:
head -n 1000 arquivo.trc | tail -n 40 - Si hay una línea
ERRORantes del rollback, corrija el error: vea errores de Oracle en el trace. - Si no hay error, confirme con quien mantiene la aplicación si el rollback forma parte de la regla de negocio.
Los rollbacks solo con rd_only=1 suelen ser rutina del pool o del framework y cuestan poco. Cada uno sigue siendo un pedido a la base de datos: si las idas y vueltas pesan en el tiempo, vea sesión esperando a la aplicación.
Cómo confirmar
Después de la corrección, genere el trace de la misma operación y compare el número de rollbacks en el Resumen y el recuento de rd_only=0 en el trace. Cuando la causa era un error, también desaparece de la sección Errores.
En el informe
- Resumen: la tarjeta Sentencias distintas, con commits y rollbacks abajo. En el ejemplo, la sesión no tiene rollback (resumen).
- Diagnóstico: el hallazgo y el enlace Ver resumen (Diagnóstico).
- Errores: los errores que suelen venir antes del rollback. La sección solo aparece cuando el trace tiene algún error (errores).
- Perfil del tiempo de respuesta: el rollback de una transacción que modificó datos también espera
log file sync(escritura del redo en el commit).