2009-06-17 11 views
37

Estoy investigando SQLite como motor de almacenamiento, y tengo curiosidad por saber si SQLite bloquea el archivo de base de datos en lecturas.¿SQLite bloquea el archivo de base de datos en lecturas?

Me preocupa el rendimiento de lectura ya que mi proyecto planificado tendrá pocas escrituras, pero muchas lecturas. Si la base de datos se bloquea, ¿se pueden tomar medidas (como el almacenamiento en memoria caché) para mitigar esto?

Respuesta

42

Desde su Wikipedia page:

varios procesos informáticos o hilos pueden acceder a la misma base de datos sin problemas. Varios accesos de lectura se pueden satisfacer en paralelo.

Más precisamente, desde su FAQ:

procesos múltiples pueden tener la misma base de datos abiertos al mismo tiempo. Múltiples procesos pueden estar haciendo un SELECTO al mismo tiempo. Pero solo un proceso puede hacer cambios en la base de datos en cualquier momento en el tiempo.

Una sola escritura a la base de datos, sin embargo, hace bloquear la base de datos por un corto tiempo para que nada se puede acceder a él en absoluto (ni siquiera la lectura). Los detalles se pueden encontrar en File Locking And Concurrency In SQLite Version 3. Básicamente, leer la base de datos no es un problema a menos que alguien quiera escribir en la base de datos de inmediato. En ese caso, el DB se bloquea exclusivamente por el tiempo que lleva ejecutar esa transacción y el bloqueo se libera después. Sin embargo, los detalles son escasos sobre qué es exactamente lo que hace con las operaciones de lectura en el paquete de datos en el momento de un bloqueo PENDIENTE o EXCLUSIVO. Supongo que devuelven SQLITE_BUSY o bloquean hasta que puedan leer. En el primer caso, no debería ser demasiado difícil simplemente volver a intentarlo, especialmente si espera pocas escrituras.

38

Puede evitar bloqueos al leer si establece el modo diario de la base de datos en el registro de escritura anticipada (consulte: http://www.sqlite.org/wal.html).

+4

Esto es mejor que la respuesta aceptada, que se escribió antes de que estuviera disponible el modo WAL. – Stretch

Cuestiones relacionadas