Saltar al contenido

Bloqueos, esperas y el error que todos conocen

«La base de datos está bloqueada»: qué significa exactamente, las cuatro causas reales, y por qué en una app de escritorio casi siempre es culpa tuya y no de la concurrencia.

Qué significa

Significa que alguien más tiene el cerrojo de escritura y tu operación no ha podido tomarlo en el tiempo de espera configurado. Y «alguien más» tiene cuatro identidades posibles:

Fíjate en que ninguna de las cuatro se arregla reintentando. El reintento oculta la primera y la segunda —que son fallos— y hace lo mismo que el tiempo de espera para la tercera, pero peor y con más código.

La primera, que es la más frecuente

Merece detalle porque es específica de escritorio y sorprende a quien viene de servidores:

Y la segunda fila de la derecha es el argumento de fondo: aunque los bloqueos se resolvieran, dos instancias sobre la misma base es un problema de coherencia, no de cerrojos. La respuesta es instancia única.

La segunda: transacciones que no se cierran

El fallo de código que produce este error, y tiene una forma reconocible:

Rust
// mal: si algo falla en medio, la transacción se queda abiertalet tx = conn.transaction()?;hacer_algo(&tx)?;          // si esto devuelve error, se sale sin cerrartx.commit()?;

En Rust esto suele estar bien —la transacción se descarta al salir del ámbito— y se rompe cuando alguien la guarda en una estructura, la pasa por ahí, o la mantiene abierta mientras espera algo. La regla: una transacción vive dentro de una función y no sale de ella. Si te ves guardándola en un campo, es señal de que el diseño va a producir este error.

Configurar la espera

El ajuste del nivel 41.2, con criterio:

  • Unos segundos está bien para una aplicación de escritorio. Cubre las coincidencias legítimas sin que el usuario note nada.
  • Cero es malo —falla al instante ante cualquier coincidencia— y muy alto también: convierte un error rápido en una interfaz congelada durante medio minuto.
  • Y si con unos segundos sigue fallando, no lo subas: busca cuál de las cuatro causas es. Un tiempo de espera alto es una tirita sobre un problema estructural.