sql >> Base de Datos >  >> RDS >> Oracle

¿Están bien las confirmaciones explícitas cuando la confirmación automática está activada?

Confirmar dentro de un ciclo es generalmente una mala idea (al igual que permitir que cualquier herramienta se confirme automáticamente).

Confirmar dentro de un ciclo hace que sea mucho más difícil escribir código reiniciable. ¿Qué sucede si encuentra un error después de 3 iteraciones? Ahora ha confirmado con éxito los resultados de 2 UPDATE declaraciones. Presumiblemente, tendría que averiguar qué filas se actualizaron y escribir código para revertir las actualizaciones o tendría que agregar un código que evite intentar actualizar los datos para esos dos yearid exitosos. valores. Eso es ciertamente posible. Pero implica escribir un montón de código para realizar un seguimiento de su progreso y, en general, hace que su código sea mucho más complejo.

Confirmar dentro de un bucle hace que su código sea mucho más lento. El compromiso es generalmente una operación bastante costosa. Hacerlo en un bucle, por lo tanto, generalmente es una mala idea. Es un problema menor si solo tiene unas pocas docenas de iteraciones de bucle. Pero si tiene cientos o miles de iteraciones, fácilmente puede terminar gastando la mayor parte de su tiempo comprometiéndose.

Confirmar dentro de un ciclo aumenta sustancialmente el riesgo de que cause un error ORA-01555. Su consulta contra MyTable necesita una vista coherente de lectura de los datos. Sin embargo, si se compromete dentro del ciclo, le está diciendo a Oracle que su sesión ya no necesita UNDO anterior. datos. Si Oracle purga UNDO datos que necesita para una iteración posterior del ciclo, obtendrá un error. Y luego vuelve a lidiar con un código no reiniciable en el que ha pasado con éxito por N iteraciones, pero no sabe qué años se han procesado o cuáles deben procesarse.

Confirmar dentro de un bucle puede crear problemas de coherencia de datos. Si alguna otra sesión está ejecutando informes, por ejemplo, es fácil que esos informes vean datos parcialmente actualizados, lo que a menudo significará que los datos serán inconsistentes. Si los datos de 3 años han cambiado pero otros años no, puede ser muy difícil dar sentido a los informes y las personas (o procesos) pueden tomar decisiones incorrectas con facilidad.

Confirmar dentro de un bucle también hace que su código sea menos reutilizable. Si su código incluye confirmaciones (o retrocesos que no sean un punto de guardado que estableció dentro del bloque), no puede ser llamado por ninguna otra pieza de código que no quiera que su transacción sea confirmada todavía. Eso lleva a las personas a tratar de volver a implementar su lógica sin el control de transacciones o a violar incorrectamente la integridad transaccional, lo que inevitablemente los lleva a crear aplicaciones que presentan problemas de coherencia de datos.