Firebird cumple con ACID al 100%, cuyas características podemos leer aquí:

https://firebird21.wordpress.com/2013/05/10/entendiendo-acid/

¿Qué implica eso sobre las transacciones?

Que siempre, en todos los casos, y sin excepción, todos los comandos deben encontrarse dentro de una transacción.

Confusión con los SELECT

Es muy frecuente que la gente piense que no necesita abrir una transacción si solamente quiere ejecutar un SELECT. Muchísimas veces ya me he encontrado con esa forma de pensar y por lo tanto decidí escribir este artículo para explicar mejor el concepto.

Los SELECT siempre se encuentran dentro de una transacción. Siempre, no hay excepciones. Siempre.

Apertura automática de las transacciones

Si tú quieres ejecutar un comando del Firebird, cualquier comando, incluyendo un SELECT, el Cliente del Firebird verifica si hay una transacción abierta. ¿Hay una transacción abierta? entonces el comando se ejecutará dentro de esa transacción. ¿No hay una transacción abierta? Entonces el Cliente del Firebird abre la transacción por tí, eso es transparente, no recibes un aviso, ni te enteras de que ha ocurrido. Pero ocurrió.

Las transacciones que el Cliente del Firebird abre automáticamente siempre son:

READ WRITE

WAIT

SNAPSHOT

Esos en general son buenos parámetros pero si lo que quieres es solamente ejecutar un SELECT entonces pueden ser mejorados.

Si una transacción es READ WRITE eso significa que el Servidor del Firebird debe estar verificando constantemente que no haya conflictos con otras transacciones que también están usando a esa misma tabla en ese mismo momento. Esa verificación toma su tiempo, no es instantánea.

En cambio si la transacción es READ ONLY el Servidor del Firebird no necesita verificar si hay conflictos por la sencilla razón de que nunca puede haber conflictos.

Por lo tanto, y en conclusión: si una transacción solamente tendra SELECTs (un SELECT o varios SELECT, y nada más) lo más conveniente es que sea READ ONLY.

Y las transacciones automáticas son READ WRITE, no son READ ONLY.

En consecuencia, si admites que el Cliente del Firebird abra la transacción por tí obtendrás los resultados más lentamente que si tú la hubieras abierto como READ ONLY.

Si tu computadora es muy rápida y las tablas tienen pocas filas no notarás la diferencia, te dará lo mismo que la transacción sea READ WRITE o READ ONLY, pero si las filas a procesar se cuentan por millones y millones entonces allí sí que será otro tema. La diferencia en tiempo puede llegar a ser muy grande.

¿Y quién será el culpable de que la consulta sea tan lenta?

Pues quien permitió que el Cliente del Firebird abra una transacción READ WRITE cuando se debería haber abierto una transacción READ ONLY, ya que solamente hay un SELECT en esa transacción. En otras palabras, tú serás el culpable.

Apertura manual de las transacciones

Cuando abres una transacción en forma manual eres tú quien decide cuales parámetros usará esa transacción. Y si sabes que solamente ejecutarás el comando SELECT dentro de ella entonces lo lógico, lo inteligente, lo razonable, es que la establezcas como READ ONLY.

¿Cuál usar, la apertura manual o la apertura automática?

La apertura automática de las transacciones solamente tiene sentido cuando estás trabajando en el desarrollo. Pero en tus aplicaciones siempre deberías usar la apertura manual de las transacciones, porque eso te dará un control total sobre las mismas.

Es decir que todas las transacciones que abras dentro de tus aplicaciones (Contabilidad, Facturación, Producción, Sueldos, Ventas, etc.) deben ser abiertas manualmente.

Cierre de las transacciones

Así como las transacciones se abren también se deben cerrar. Una transacción se cierra con el comando COMMIT o con el comando ROLLBACK.

Si no cierras una transacción entonces tu Base de Datos irá creciendo mucho más de lo que debería y como consecuencia todas las operaciones se volverán muy lentas.

Recuerda que todas las transacciones deben cerrarse, inclusive las que solamente tienen un SELECT.

No hay excepción a esta regla.

O cierras la transacción (con un COMMIT o con un ROLLBACK) o tu Base de Datos irá creciendo y llenándose de basura, y volviéndose cada vez más lenta.

Duración de las transacciones

Cuanto más tiempo esté una transacción abierta es mayor el riesgo de conflicto con otras transacciones. No es lo mismo una transacción que demora 15 milisegundos en completarse que una transacción que demora 40 minutos. En el caso de la primera la probabilidad de conflicto es muy pequeña, en el caso de la segunda la probabilidad de conflicto aumenta muchísimo.

Por lo tanto, deberías proceder así:

  • Abrir la transacción manualmente, con los parámetros más adecuados para el caso
  • Ejecutar todos los comandos pertenencientes a esta transacción
  • Cerrar la transacción

Recuerda que las transacciones cortas, que empiezan y terminan muy rápidamente son las ideales.

Las transacciones largas solamente pueden causar problemas y ningún beneficio.

Conclusión:

Como Firebird cumple con ACID al 100% entonces siempre, sí o sí, todos los comandos deben encontrarse dentro de una transacción. Eso incluye a los SELECT, por supuesto.

Entonces, aunque solamente necesites escribir un SELECT éste siempre se encontrará dentro de una transacción.

Si tú no estableces los parámetros de una transacción entonces el Cliente del Firebird los establece por tí. Eso tiene la ventaja de que debes escribir menos pero tiene la desventaja de que los parámetros que estableció el Cliente del Firebird pueden no ser los más adecuados para tu caso. Lo aconsejable es que en todas tus aplicaciones seas tú quien se encargue de establecer los parámetros de las transacciones, así te asegurarás de que todo siempre ocurra de la manera que tú quieres que ocurra.

Artículos relacionados:

Entendiendo ACID

Parámetros de las transacciones usando Visual FoxPro

El índice del blog Firebird21

 

Anuncios