Como ya seguramente sabes, puedes verificar cuales son los valores actuales de los identificadores de las transacciones con el comando GSTAT – h, algo como:

VERIFICAR1

Captura 1. Si haces clic en la imagen la verás más grande

Si nadie está usando la Base de Datos y si todas tus transacciones finalizan con un COMMIT o con un ROLLBACK entonces siempre deberías ver algo así: la diferencia entre la “Oldest transaction” y la “Oldest active” nunca debería ser mayor que 1 (uno) y la diferencia entre la “Oldest snapshot” y la “Next transaction”  tampoco debería ser mayor que 1 (uno). Por lo tanto en ningún caso la diferencia entre los distintos identificadores debería ser mayor que 2 (dos).

Tú has verificado exhaustivamente tus aplicaciones, estás 100% seguro de que todas las transacciones, sin excepción, finalizan con un COMMIT o con un ROLLBACK, entonces no deberías molestarte en verificar los identificadores de las transacciones porque siempre tendrán una diferencia de 1 ó 2 entre ellos, ¿verdad?

No, falso.

Sería verdad si todas las aplicaciones siempre se cierran correctamente, pero no puedes asegurar de que eso siempre ocurrirá. Si hubo un corte de la energía eléctrica que  afectó a una computadora que tenía una transacción abierta o si un usuario (muy inteligente él, claro) hizo un CTRL-ALT-DEL o apretó el botón de “Reset” de la computadora entonces la aplicación que el inteligente usuario estaba usando sin dudas que finalizó pero las transacciones que esa aplicación tenía abiertas, no. No finalizaron.

Al salir de la aplicación de manera incorrecta (por medio de un CTRL-ALT-DEL, por ejemplo) la aplicación terminó, pero todas las transacciones que esa aplicación tenía abiertas continúan abiertas.

Y pasa un día, pasan dos días, pasan quinientos días y esas transacciones continuarán abiertas.

El Firebird no tiene un time-out, o sea un tiempo máximo para que una transacción continúe abierta. Una transacción “normalmente” solamente puede finalizar con un COMMIT o con un ROLLBACK.

¿Y cuál es el problema de que una transacción que nadie usa continúe abierta?

Que el Firebird no hará una limpieza automática (llamada “garbage collection” o “recolección de basura” en castellano) de las transacciones más nuevas que la OAT (Oldest Active Transaction).

Eso implica que toda la basura que fueron dejando las transacciones más nuevas (siempre se deja basura cuando se modifica o se borra un registro) quedarán dentro de la Base de Datos.

Si la OAT ocurrió hace un mes entonces toda la basura que las siguientes transacciones fueron dejando al modificar o borrar registros están ahora dentro de la Base de Datos.

Y tener basura dentro de la Base de Datos no te provee de algún beneficio y sí te causa problemas: todo es más lento de lo que debería ser. Y cuanta más basura se vaya acumulando, más y más lentas serán todas las operaciones.

Por lo tanto, aunque tú estés 100% seguro de que todas tus transacciones finalizan correctamente con un COMMIT o con un ROLLBACK, como debe ser, siempre debes verificar los identificadores de las transacciones porque nunca podrás descartar que no haya ocurrido un corte de la energía eléctrica o que un usuario no haya presionado las teclas CTRL-ALT-DEL.

Conclusión:

Aunque estés 100% seguro de que todas las transacciones que abren tus aplicaciones son luego cerradas con un COMMIT o con un ROLLBACK igualmente debes verificar periódicamente los identificadores de las transacciones con el comando GSTAT -h porque si por cualquier motivo una aplicación finalizó incorrectamente (por medio de un CTRL-ALT-DEL, por ejemplo) entonces esa aplicación que finalizó incorrectamente pudo haber dejado transacciones abiertas.

Y las transacciones que están abiertas pero que nadie las usa (porque la aplicación que las creó ya finalizó hace mucho) solamente causan problemas.

Por lo tanto, si hay transacciones abiertas pero no usadas debes eliminarlas.

Dependiendo del tamaño de tu Base de Datos y de la cantidad de usuarios concurrentes que puede tener deberías ejecutar el comando GSTAT -h cada día o cada semana o cada quince días, etc., pero debes hacerlo, no te olvides de hacerlo. O alguna vez podrías encontrarte con la desagradable sorpresa que la diferencia entre los identificadores de las transacciones es inmensa.

Artículos relacionados:

Entendiendo los identificadores de las transacciones

Conociendo el programa que mantiene una transacción abierta

El índice del blog Firebird21

 

Anuncios