TRANSACCIONES AUTONOMAS

Regresar

Qué es una transacción autónoma?


Para poder responder a esta interrogante se debe tener claro en primer lugar el concepto de transacción. Una transacción es un conjunto de operaciones que se ejecutan en la base de datos y se comportan como una unidad, es decir varias instrucciones SQL que se confirman o no en la base de datos. Se comportan como un todo o nada. Este comportamiento es fundamental para programar reglas del negocio.

Veamos algunos ejemplos típicos:

- El pago de un servicio mediante una tarjeta débito. Consiste de varios pasos, verificar el titular de la tarjeta, verificar que el saldo alcance para realizar el pago, descontar el valor a pagar de la cuenta de la tarjeta, marcar el pago como realizado, abonar el valor pagado al servicio. Todos estos pasos deben ser correctos y confirmarse todos para que la operación sea exitosa. Si se descuenta el valor de la cuenta, pero no se marca el servicio como pagado, se va a tener una inconsistencia.

- La venta de un producto. Una aplicación típica de ventas, tiene unos productos en inventario, el usuario selecciona los productos que quiere y confirma su pedido, en ese momento se deben descontar de las existencias los productos que se venden al cliente, de esta manera se evita vender productos de los cuales no se poseen existencias.

- La liquidación de un siniestro (Más cercano a nuestras necesidades), se debe verificar que se posea la reserva suficiente para realizar el pago de una indemnización, se debe solicitar la información del pago a realizar, se realizan las validaciones correspondientes, se calculan impuestos, se genera el cheque y se disminuye la reserva. Todos estos pasos deben cumplirse correctamente o no se debe generar el cheque.

Ahora teniendo claro que las reglas del negocio se deben cumplir de manera todo o nada, en qué casos puede ser de utilidad que se ejecute media transacción?

Existen casos puntuales, en los cuales es posible que una funcionalidad adicional o extra, la cual no tiene la relevancia suficiente como para interrumpir la regla de negocio principal, puede que no se realice y aun así la funcionalidad principal deba confirmarse.

- Oracle forms hace uso de esta funcionalidad desde sus primeras versiones, permitía invocar desde una pantalla otra completamente independiente, de manera que se podía guardar en la segunda pantalla sin que esto afectara la transacción de la primera pantalla, esto es de utilidad cuando la primera pantalla solicita información que se registra desde otra, de esta manera se invoca la segunda pantalla, se ingresa la información y se almacena, se regresa a la primera pantalla y puede hacerse uso de la nueva información capturada.

- Otro ejemplo típico de esto corresponde a los logs de auditoría, si se lleva un control sobre los accesos a una determinada funcionalidad, es independiente de la utilización de esa funcionalidad, es decir se debe almacenar el ingreso del usuario independiente de si guarda el trabajo realizado con dicha funcionalidad, de manera que es autónomo el almacenamiento de la auditoría.

No todo procedimiento puede ser autónomo, se debe realizar un análisis de la funcionalidad, conocer el papel que desempeña dentro de la regla de negocio antes de decidir si puede convertirse o no en un proceso autónomo.

Las transacciones autónomas no nos nuevas funcionalidades de las últimas versiones del servidor de base de datos, son muy peligrosas y deben tratarse con cuidado, yo las pongo al mismo nivel del manejo de excepciones, una transacción autónoma mal empleada es similar a un WHEN-OTHERS THEN NULL mal empleado, son el origen de problemas difíciles de detectar.

Utilizar transacciones autónomas dentro de triggers se considera una mala práctica, si se incluye lógica de negocio dentro de un trigger, se espera que se realice automáticamente y forme parte de la transacción. A menos que se trate como se mencionó anteriormente de logs de auditoría, y se realice en triggers separados de la lógica del negocio utilizando para esto la posibilidad de crear varios triggers y definir el orden de ejecución característica implementada en Oracle 11.

Para información adicional sobre la utilización de transacciones autónomas en triggers se pueden revisar los siguientes enlaces:
http://forums.oracle.com/forums/thread.jspa?threadID=474329
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2212445691154

Para revisar la documentación sobre manejo de transacciones, incluyendo autónomas se puede ingresar en la siguiente dirección:
http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/transact.htm