Fredy,
> El problema es ese, que bloquea la base de datos.
>
> En un entorno multiusuario, si otro usuario inicia una
> transacción y yo intento iniciar otra antes de que la del
> usuario 1 finalice, sqlite genera un error 5 (Database is
> locked).
>
> El problema que me genera esto, es que cuanto más larga sea
> la transacción más fácil es que otro usuario tenga
> problemas. Imagínate una regeneración de almacenes que
> dure 3 minutos. Si no uso transacciones, en lugar de 3
> minutos igual son 30. Si uso transacciones, cualquier
> usuario que intente grabar un dato durante los 3 minutos del
> proceso recibirá como respuesta un error de sqllite y
> posiblemente pierda los datos introducidos.
Lo ideal con SQLite es que las transacciones sean muy rápidas, nunca más
de unos pocos (muy pocos) segundos. Si hay procesos que requieren
transacciones largas, y en un entorno multiusuario, entonces lo más
indicado es cambiar a otra BD.
La BD más parecida a SQLite, en cuanto a sintaxis, es MySQL. Yo tengo
aplicaciones que soportan ambos motores, y que se cambia de uno a otro
desde una opción de configuración. Todo el programa, excepto la parte de
abrir y crear las BB.DD., es común a ambos motores, es decir, que no he
tenido que cambiar ni una línea de código para usar uno u otro. Y tengo
unas cuantas sentencias relativamente complejas. Tan sólo hay una
pequeña diferencia que encontré entre ambos, pero no es muy habitual
tropezarte con eso.
Ahora bien, MySQL es de pago. Pero afortunadamente, ahora tenemos una
alternativa: MariaDB

> Por eso me gustaría conocer de antemano si la base de datos
> está bloqueada y esperar a que la base de datos esté
> desbloqueada en lugar de que genere el error.
>
> En la prehistoria, con dbfs

teníamos el FLock(), que es
> algo parecido.
El eterno dilema de los "bloqueos pesimistas" frente a los "bloqueos
optimistas"...
> He probado con nTimeOut, pero creo que sqlite no lo
> utiliza.
>
> Según he visto en
http://www.sqlite.org/tempfiles.html
> creo que puedo solucionarlo jugando con el fichero -journal
> de la database , pero sería mucho más fácil si ya existe
> algo para hacerlo.
Hasta donde yo sé, los journals son otra cosa. Los crea la propia BD
durante una transacción, y sólo sirven para hacer un rollback automático
cuando se abre la BD después de un corte de luz o algún fallo similar.
Pero dudo mucho que puedas manipularlos o usarlos directamente para
ningún otro fin.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info