SQLite: resolver el error «database is locked»

DELPHIHEAVEN · GUÍA PRÁCTICA

SQLite: resolver el error «database is locked»

Diagnóstico y prevención de los bloqueos en aplicaciones Delphi con FireDAC.

Los fragmentos son ejemplos didácticos; se adaptan los nombres y rutas al proyecto y se comprueban en Delphi antes de utilizarlos en producción.

Qué sucede

SQLite permite concurrencia de lectura, pero las operaciones de escritura requieren coordinación. SQLITE_BUSY suele aparecer por conflictos entre conexiones. SQLITE_LOCKED suele señalar un conflicto dentro de una conexión o de una caché compartida. No se deben confundir ambos resultados.

Pasos de diagnóstico

  1. Se comprueba si existe otra instancia de la aplicación o un administrador SQLite abierto.
  2. Se revisan las conexiones y consultas que siguen activas.
  3. Se comprueba que las transacciones terminan con Commit o Rollback.
  4. Se analiza si varios formularios abren conexiones redundantes.
  5. Se registran los pasos anteriores a la excepción.

Tiempo de espera

// Se ejecuta sobre la conexión activa.
FDConnection1.ExecSQL('PRAGMA busy_timeout = 5000');

Comprobación y precauciones

El tiempo de espera ayuda ante conflictos breves, pero no corrige una transacción que permanece abierta. Se repite la operación y se prueban varias instancias. No se eliminan manualmente los ficheros -wal o -shm mientras SQLite está en uso.

Referencias (APA 7)

SQLite. (s. f.). Result and error codes. SQLite Documentation.

Embarcadero Technologies. (s. f.). Using SQLite with FireDAC. RAD Studio Documentation.

SQLite. (s. f.). PRAGMA statements. SQLite Documentation.

Todas las guías Proyecto relacionado