Api de Base de datos en OpenACS 5.1 Transacciones.....
(Tercera Parte)
Una transacción es un grupo de instrucciones sobre Bases de datos que se ejecutan en conjunto para realizar una determinada funcionalidad.
La característica más importante de una transaccion es el hecho de que la transacción o se realiza completamente o en caso de algún error se deshacen las instrucciones ejecutadas para dar consistencia a los datos almacenados.
Un ejemplo de su uso....
* Imaginemos un cajero automático que funciona realizando consultas y ejecutando intrucciones SQL sobre su BD.
* Pongamonos en la situación de un cliente que desea sacar 50€ de su cuenta a través del cajero.
Introduce su tarjeta, teclea su codigo y solicita retirar 50€ de su cuenta.
* El cajero realiza lo siguiente:
- Comprueba que el cliente posee suficiente saldo en la cuenta.
- Pedirá confirmación al cliente.
- Actualizará el saldo restando 50€.
- Enviará el dinero al cliente.
- Imprimirá el recibo.
Con esta situación y para ver la utilidad de las transacciones de BD sobre servicios "criticos" implementados con BD supongamos que hay un corte de suministro eléctrico justo en el momento en que el cajero acaba de actualizar el saldo.
Tenemos entonces un cliente que posee 50€ menos en su cuenta sin haberlos recibido realmente.
Si se hubieran utilizado transacciones se hubiera abortado la operación con lo cual no se habria descontado la cantidad hasta finalizar toda la operación.
Veamos algunas de las funciones que la API de OpenACS pone a nuestra disposición para el manejo de transacciones:
* db_transaction: Es la encargada de definir una operación de transacción.
Su síntaxis es : db_transaction bloque_codigo [on_error bloque_codigo_error]
bloque_codigo recoje las instrucciones que forman parte de la transacción, y la seccion on_error ejecuta el bloque de codigo bloque_codigo_error en el caso de que haya algun error al ejecutar la transacción.
Veamos como quedaria nuestro ejemplo del cajero:
db_transaction{
db_1row saldo "SELECT saldo FROM clientes WHERE cliente_id=id"
if [ saldo > 50 ]{
confirmar
actualizar_saldo $dinero_sol
proporcionar_cantidad $dinero_sol
imprimir_recibo
}
else{
doc_body_append "Error: Saldo Insuficiente"
}
db_abort_transaction
}
on_error{
doc_body_append "Error en transaccion"
}
Notas sobre el ejemplo:
1) las funciones actualizar, proporcionar_cantidad e imprimir_recibo son procedimientos en Tcl que deben ser implementados, pero que para no complicar el codigo expuesto considero que para nuestro ejemplo son suficientemente autoexplicativos.
2) Utilizamos en el codigo la función "doc_body_append", esta función de openacs toma una cadena de texto y la incorpora el en BODY de la pagina de nuestro portal.
3) Como podemos ver una transacción finaliza con la instrucción " db_abort_transaction" la cual aborta la transacción.
Una característica muy útil es la posibilidad de definir transacciones anidadas, en estos casos deberemos tener en cuenta que la instrucción "db_abort_transaction" no solo finaliza la transacción en la que se la llama sino todas las demas en las que esté anidada.
Deberemos entonces tener la precaución de utilizar esta instrucción al final de la transaccion principal.
lunes, julio 25, 2005
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario