Cargando

Por Alfonso Ricaño Bringas

Transacciones con IBX

El manejo de las transacciones es un nuevo tema para algunas personas, ya que aunque la BDE permite utilizarlas hasta con tablas de archivos de datos (Paradox, dBase), no siempre son utilizadas. Con los IBX, siempre se tiene que utilizar al menos una transacción, ya que todo IBDataSet debe estar enlazado a un IBTransaction para funcionar.

Entonces surge la pregunta: ?Cómo utilizar las transacciones con los IBX? Bueno, la respuesta no es una sola, ya que hay varias maneras de utilizarlas, y para comprender bien este tema, tenemos que conocer a fondo el sistema de transacciones de InterBase. Pero dado que este curso es introductivo, me limitaré a dar algunos hechos sobre cómo funcionan las transacciones y la forma más fácil de utilizarlas. A continuación enlisto unos puntos que nos permiten ir conociendo más el funcionamiento de las transacciones: 1.- Se necesita al menos un componente IBTransaction en cualquier aplicación que utilice IBX. 2.- Para abrir un IBDataSet, debe estar abierta una transacción en el componente IBTransaction al que está enlazado. 3.- Cuando se hace un Commit o un Rollback en un IBTransaction, se cerrarán todos los IBDatasets que están ligados al IBTransaction. 4.- Cuando se hace un CommitRetaining o un RollbackRetaining* en un IBTransaction, no se cierran los IBDatasets ligados al IBTransaction. 5.- Para que cualquier operación o conjunto de operaciones hechos con un IBDataset sean visibles a los demás usuarios, es decir, sean aplicadas definitivamente a la base de datos, se tiene que hacer un Commit o un CommitRetaining en el componente IBTransaction al que está relacionado. Teniendo como marco estos puntos, voy a ilustrar una manera sencilla de manejar las transacciones, mediante un ejemplo.

Un ejemplo de utilización de las transacciones con los IBX

Vamos a ver el caso más sencillo: Dar mantenimiento (agregar, modificar, eliminar) a una tabla de la base de datos InterBase, que está controlada con un IBDataSet llamado IBDataSet1. En este caso, tenemos que aplicar la transacción cada vez que se agregue, modifique o borre un registro, por lo tanto debemos de hacer un Commit en el evento AfterPost y AfterDelete del IBDataSet. Como sabemos de antemano que el método Commit de los IBTransaction cierra todos los IBDataSets que están ligados a él, entonces deberemos de reabrirlos inmediatamente después de haber hecho el Commit. Esto trae como consecuencia que el cursor del IBDataSet se posicione en el primer registro de la tabla, cosa que para algunos es molesta, ya que generalmente queremos que el cursor se quede en el registro agregado. Si no queremos hacer un Commit y que se cierren todos los IBDataSets que están conectados al IBTransaction, podemos utilizar el método CommitRetaining, con el cual nos aseguramos que los IBDataSets seguirán abiertos y que sin embargo, la transacción será aplicada. Y ?porqué poner el CommitRetaining en los eventos AfterPost y AfterDelete? Bueno, pues porque el evento AfterPost se ejecuta inmediatamente después de haber guardado los cambos en una inserción o una modificación de un registro, y es precisamente cuando el programa manda al servidor la instrucción SQL de insertar o modificar. AfterDelete tambien se ejecuta después de que se confirma la eliminación de un registro, por lo que también hay que especificarle al servidor que tiene aplicar ese cambio. Ahora, ?qué pasa cuando se cancela la inserción o modificación de un registro? Bueno, pues se puede ejecutar el método RollbackRetaining para deshacer la transacción. Cabe aclarar que RollbackRetaining puede ser utilizado únicamente en la última versión de InterBase (6.0.x), y que no es posible utilizarlo en otras versiones, por lo que se tendrá que utilizar Rollback en versiones 5.6 y anteriores. Esta es una manera muy sencilla de utilizar las transacciones, pero cuando queremos controlar la aplicación de actualizaciones de varias tablas, entonces tendremos que poner los CommitRetaining y RollBackRetaining en otro lado, y no precisamente en los eventos de algún IBDataSet. Por ejemplo, si tenemos una forma de captura de facturas, donde capturamos los datos del cliente en una tabla y en otra tabla se guardan los artículos que se le vendieron entonces tenemos que aplicar la transacción cuando se confirme la venta, que puede ser en un botón de Aceptar, y cancelar la transacción en otro botón Cancelar. De esta manera sabemos que cuando se oprima el botón aceptar, se aplicará tanto la captura de los datos del cliente, como los artículos que compró. En artículos posteriores hablaré de las diferencias entre Commit y CommitRetaining, y también de cómo utilizar eficientemente las transacciones dependiendo de la interfaz que se use en la aplicación.