Los triggers son bloques de código que se ejecutan automáticamente en respuesta a ciertos eventos en la base de datos, como inserciones, actualizaciones o eliminaciones de registros. En términos de resiliencia y recuperación, Oracle ofrece varios mecanismos para manejar errores y garantizar la integridad de las transacciones en las que participan los triggers. A continuación, se detallan algunos aspectos clave:
1. Atomicidad y Consistencia
- Atomicidad: Los triggers en Oracle se ejecutan como parte de la transacción que los activa. Esto significa que si un trigger falla, la transacción completa se revierte, garantizando que los cambios no se apliquen parcialmente.
- Consistencia: Los triggers deben mantener la consistencia de los datos. Si una operación del trigger genera un error, la transacción completa se revierte para mantener la integridad de la base de datos.
2. Mecanismos de Manejo de Errores
- Excepciones en PL/SQL: Dentro de un trigger, se pueden manejar errores utilizando bloques
EXCEPTION
. Esto permite capturar errores específicos y tomar acciones adecuadas, como registrar el error en una tabla de auditoría, enviar notificaciones, o realizar limpiezas necesarias. - RAISE_APPLICATION_ERROR: Permite generar errores personalizados dentro de un trigger, lo que puede ser útil para manejar situaciones específicas y proporcionar mensajes de error más claros.
3. Logs y Auditorías
- Registros y Auditorías: Los triggers pueden incluir lógica para registrar eventos y errores en tablas de auditoría. Esto proporciona un historial de eventos y errores que puede ser analizado posteriormente.
4. Garantías de Ejecución
- Control de Estados: Oracle garantiza que un trigger se ejecuta en el estado adecuado de la transacción. Por ejemplo, los triggers
BEFORE
se ejecutan antes de que se realice la operación DML, y los triggers AFTER
se ejecutan después de la operación DML pero antes de que se confirme la transacción.
5. Control de Fallos
- Reversión Automática: Si ocurre un error no manejado dentro de un trigger, la transacción entera que activó el trigger se revierte automáticamente. Esto incluye todas las operaciones DML que hayan ocurrido dentro de la transacción.
6. Eventos de Recuperación
- Eventos de Reintento: En algunos escenarios, es posible implementar lógica para reintentar operaciones fallidas. Aunque no es un mecanismo nativo de los triggers, se puede implementar mediante programación adicional, como paquetes PL/SQL que manejen la lógica de reintento.
Transactional Outbox Pattern by Database trigger
Evaluación de pros/contras
Pros para cualquier tipo de proyecto 👍 |
---|
Asegura la creación del evento gracias a su atomicidad y consistencia |
No hay una comunicación directa desde el sistema origen con el event buffer. Esto aporta varias ventajas: - Se puede contar con un microservicio reutilizable e independiente del sistema origen.
|
Pros para proyectos ya existentes 👍 |
---|
No requiere cambio en el código del proyecto para la generación de los eventos. |
En relación a la comunicación del sistema origen con el event buffer, se aportan varias ventajas adicionales a los proyectos existentes: - No es necesario modificar el código del proyecto existente para tener esta funcionalidad.
|
Contras para cualquier tipo de proyecto 👎 |
---|
Implica cambios en la base de datos, se debe crear una tabla para persistencia de los eventos a generar. |
Hay riesgo de impacto en la performance de la bbdd del sistema, al realizar consultas cada intervalo de tiempo x. |
Evaluación de requisitos
Requisito | OK/NOK | Detalle |
---|
Resiliente | | - ⚠️ Hay que implementar de mecanismos de fault-tolerance en cada uno cada paso
- ✔️ Al hacer uso de una tabla auxiliar y un event buffer puedes tener la garantía de entrega ante caídas.
- ✔️ Si el Sistema Origen se cae, al estar persistida la necesidad de sincronización, se puede volver a retomar desde la última sincronización correcta.
- ✔️ El event buffer al tener persistencia de mensajes y posibilidad de ack de entrega puedes garantizar simplemente la recepción o la lectura del mismo por algún consumidor según se defina la necesidad de confirmación de entrega.
|
Transaccional | | ✔️Se establecen los siguientes tramos transaccionales: - Persistencia del cambio: La persistencia tanto en la tabla de origen como en la tabla de evento, se puede realizar como transacción local.
- Generación de Eventos: El event buffer tiene diferente estrategias en la garantía de entrega.
|
Idemponente | | - ✔️ Hay que asegurarse de que los eventos en la outbox se marquen como procesados.
- ⚠️ Necesita lógica adicional para asegurar idempotencia
|
No invasivo - Código | | ✔️ No requiere cambio de código |
No invasivo - BBDD | | - ⚠️ Requiere la creación de una tabla para persistir los eventos de sincronización
- ⚠️ Requiere la creación de un trigger
|
Compatible con las tecnologías actuales | | ✔️ Al no añadir ninguna tecnología extra al (la conexión con el event buffer es a través de un nuevo microservicio) no se aprecian incompatibilidades. |