Está en la página 1de 14

Muchos manejadores de bases de datos (DBMSs) cuentan con sistemas de

recuperacin ante fallos, que permiten dejar la base de datos en estado


consistente cuando ocurren imprevistos tales como apagones o cadas del sistema
Los manejadores de bases de datos (DBMSs) que ofrecen integridad transaccional
permiten establecer unidades de trabajo lgicas (UTLs), que corresponden ni ms ni
menos que al concepto de transacciones de base de datos.
Podemos ver que una unidad de trabajo lgica (UTL) queda definida por el conjunto de
operaciones entre un par de Commits.
Por defecto GeneXus incluye en los programas generados asociados a los mismos,
la sentencia COMMIT.

En el objeto procedimiento: COMMIT automtico al final del Source.

En el objeto transaccin: COMMIT automtico al final de cada


instancia, inmediatamente antes de las reglas con evento de
disparo AfterComplete.
GeneXus ofrece una propiedad a nivel de cada objeto transaccin y procedimiento,
para definir si se quiere que el programa generado asociado al objeto efecte
COMMIT, o no.

El nombre de la propiedad es Commit on Exit y su valor por defecto es Yes (por eso,
toda transaccin y procedimiento por defecto efectan COMMIT).
Por qu motivo se puede necesitar no efectuar COMMIT?
Para personalizar una unidad de trabajo lgica (UTL). Es decir, podemos necesitar ampliar una
unidad de trabajo lgica (UTL) para que varios procedimientos o una transaccin y algn
procedimiento, juntos, conformen una nica unidad de trabajo lgica (UTL) transacciones1.

Ejemplo (mostrado arriba):

La transaccin X invoca al procedimiento Y y se desea que ambos objetos conformen una nica
UTL. Es decir, la transaccin actualiza ciertos registros y el procedimiento otros, y se desea que
ese conjunto total de operaciones conforme una nica UTL (para asegurarnos que si ocurre una
falla, quede efectuado o bien el conjunto completo de actualizaciones a la base de datos, o nada).

Para lograrlo podemos eliminar el COMMIT del procedimiento y dejar que se realice en la
transaccin (al retornar del procedimiento a la transaccin, para que se ejecute al final de todas
las operaciones).

De modo que configuraramos la propiedad Commit on Exit del procedimiento con valor: No y
dejaramos la propiedad Commit on Exit de la transaccin con el valor por defecto: Yes. Pero
adems de esto, es fundamental que la invocacin al procedimiento se realice antes de que se
ejecute el COMMIT en la transaccin (ya que la idea es que ambos objetos conformen una
nica UTL y para ello el COMMIT debe efectuarse en la transaccin al retornar del procedimiento).
As que la invocacin al procedimiento deber definirse en la transaccin, con un evento de disparo
que ocurra antes de la ejecucin del COMMIT (dependiendo de si la transaccin es de un nivel o
ms, y de los requerimientos, podra servir AfterInsert por ejemplo, AfterUpdate, o AfterLevel
Level Atributo del 2do nivel, o BeforeComplete, pero no AfterComplete).

No existe una nica solucin para personalizar una UTL. Lo fundamental es analizar cul objeto
puede hacer COMMIT (pudiendo haber ms de una posibilidad) y una vez que se decida cul objeto
efectuar COMMIT, las invocaciones que se requieran hacer, debern efectuarse en momentos
adecuados, considerando si ya se efectu el COMMIT o no.

---------------------------------------------------------------------------------------------------------------------
1 En ambiente Web existe una importante restriccin a este respecto: si desde una transaccin se
invoca a otra, el Commit que realice una no aplica sobre los registros
ingresados/modificados/eliminados por la otra. Es decir, el Commit de cada transaccin solo tiene
visibilidad sobre los registros operados por esa transaccin, y no por la otra, por lo que dos
transacciones distintas no pueden quedar incluidas en una misma UTL. No puede realizarse
personalizacin en este caso.

10
Ejemplo: El usuario final decide si ejecutar Commit o Rollback

Se invoca desde un web panel (en determinado evento) a varios


procedimientos consecutivos. Se les configura a todos ellos la propiedad
Commit on exit = No.
La sentencia siguiente a la invocacin al ltimo procedimiento es una
pregunta al usuario sobre si confirma todo lo ejecutado o no.
Dependiendo de la respuesta del usuario, habr que ejecutar el comando
COMMIT o ROLLBACK.

También podría gustarte