Como seguramente sabrás, las bases de datos de Firebird son muy confiables e inclusive un corte de la energía eléctrica no les afecta. Con un uso normal pueden ser usadas durante decenas de años sin el menor problema. Pero ¿por qué es así? ¿Por qué tenemos tanta seguridad?

Esto se debe a la metodología utilizada para escribir dentro de una Base de Datos.

Su nombre, en inglés es “careful writes” y significa: “escrituras cuidadosas”.

Como funciona careful writes.

La idea es nunca tener inconsistencias. Y eso se logra de la siguiente manera:

  1. Cuando se quiere insertar un objeto, primero se inserta el objeto y luego el puntero a ese objeto
  2. Cuando se quiere eliminar un objeto, primero se elimina el puntero y luego el objeto

Ejemplo 1: Agregar una página de datos a una tabla

  1. El número de la página se obtiene de la lista de páginas no usadas y se marca esa página como usada
  2. La página es formateada para indicar que contendrá datos de esa tabla. Luego se la escribe en la Base de Datos
  3. El número de la página es escrito en la lista de páginas que pertenecen a esa tabla

Fíjate que cada uno de esos pasos ha escrito algo en la Base de Datos.

En el paso 1. la intención es evitar que ese número de página sea usado por dos (o más) objetos. Así que o ningún objeto está usando esa página o un solo objeto la está usando. No hay otra alternativa.

¿Qué ocurre si la Base de Datos se detiene entre los pasos 1. y 2. o entre los pasos 2. y 3.?

Supongamos que ocurrió un corte de la energía eléctrica. ¿Cómo quedará la Base de Datos?

  • La página estará marcada como “usada”
  • La página no estará asociada con una tabla, ni con un índice, ni con alguna otra cosa

La página en realidad no está siendo usada, aunque esté marcada como tal, por lo tanto está gastando un poco de espacio pero eso no causa el menor problema. Simplemente está allí ocupando espacio innecesariamente, hasta que un sweep la elimine o la Base de Datos sea restaurada desde un backup.

El espacio que ocupa una página es muy pequeño, lo determinas cuando creas la Base de Datos o cuando restauras un backup. Los valores posibles son: 4096 bytes, 8192 bytes, y 16384 bytes, los cuales para el gigantesco tamaño de los discos duros actuales son totalmente insignificantes.

Y como puedes ver, la Base de Datos mantuvo su consistencia.

Ejemplo 2. Recolectando la basura

Como recordarás, cada vez que se realiza un UPDATE o un DELETE el Firebird agrega una nueva versión de esa fila a la tabla. Cada una de esas versiones tiene un puntero a la versión siguiente, eso se hace así para que se pueda seguir la cadena y conocer el contenido actual de la fila. Entonces, para recolectar la basura que tiene una fila:

  1. Se elimina el puntero a la versión en la siguiente versión
  2. Se elimina la entrada en la página de datos donde se encuentra la fila actual
  3. Se eliminan las entradas de índices que ya no son válidas

¿Qué ocurre si la Base de Datos se detiene entre los pasos 1. y 2. o entre los pasos 2. y 3.?

Supongamos que ocurrió un corte de la energía eléctrica. ¿Cómo quedará la Base de Datos?

La basura continuará allí, por lo tanto ocupando espacio, pero eso no causará problemas, simplemente se estará gastando un poco de espacio innecesariamente. Ese espacio se recuperará cuando se realice un sweep o la Base de Datos sea restaurada desde un backup.

Y como puedes ver, la Base de Datos mantuvo su consistencia.

Conclusión:

Cada vez que el Firebird escribe algo en una Base de Datos lo hace a través de una metodología llamada “careful writes” o escrituras cuidadosas.

Mediante esta metodología hay una seguridad del 100% de que jamás una Base de Datos tendrá inconsistencias. Si ocurre un corte de la energía eléctrica o de la conexión con el Servidor, lo peor que podría ocurrir es que se esté gastando un poco más de espacio de lo que se debería, pero ese espacio gastado es pequeñísimo y además será eliminado cuando se realice un sweep o cuando se restaure la Base de Datos.

Artículos relacionados:

Entendiendo las páginas de la Base de Datos

Eligiendo el tamaño adecuado de las páginas de la Base de Datos

Entendiendo a las transacciones

El índice del blog Firebird21

El foro del blog Firebird21