¿Cómo evito los bloqueos de la base de datos SQLite?

10

Desde las preguntas frecuentes de SQLite he sabido que:

Varios procesos pueden tener la misma base de datos abierta al mismo tiempo. Se pueden hacer múltiples procesos SELECTal mismo tiempo. Sin embargo, solo un proceso puede hacer cambios en la base de datos en cualquier momento.

Así, en lo que a entender que puedo: 1) Leer db desde varios subprocesos ( SELECT) 2) Leer db desde varios subprocesos ( SELECT) y escribir desde un solo hilo ( CREATE, INSERT, DELETE)

Pero leí sobre el registro de escritura anticipada que proporciona más concurrencia ya que los lectores no bloquean a los escritores y un escritor no bloquea a los lectores . La lectura y la escritura pueden continuar simultáneamente.

Por último, tengo completamente confusa cuando descubrí que , cuando se especifica:

Aquí hay otras razones para obtener un error SQLITE_LOCKED:

  • Intentando CREATEo DROPuna tabla o índice mientras una SELECTdeclaración aún está pendiente.
  • Intentando escribir en una tabla mientras a SELECTestá activo en esa misma tabla.
  • Intentando hacer dos SELECTen la misma tabla al mismo tiempo en una aplicación multiproceso, si sqlite no está configurado para hacerlo.
  • fcntl (3, falla la llamada F_SETLK en el archivo DB. Esto podría deberse a un problema de bloqueo de NFS, por ejemplo. Una solución para este problema es eliminar el DB y copiarlo de nuevo para que tenga un nuevo valor de Inode

Entonces, me gustaría aclarar por mí mismo, ¿es necesario evitar el bloqueo? ¿Puedo leer y escribir al mismo tiempo desde dos hilos diferentes? Gracias.

Andrei Orlov
fuente

Respuestas:

8

Esa página que vinculó, además de ser bastante antigua, habla de accesos desde el mismo proceso a través de la misma conexión de base de datos (o mediante conexiones multipe en modo de caché compartida , que no debe usar).

Cuando no está en modo WAL, se pueden leer múltiples conexiones de la misma base de datos, pero una transacción de escritura es exclusiva, es decir, no se permiten otros lectores o escritores.

En el modo WAL, un escritor y lectores no se bloquean entre sí, pero todavía hay un solo escritor permitido.

CL.
fuente
1
¿Qué hay de malo con el modo de caché compartida? Pude obtener múltiples subprocesos de python en el mismo proceso para escribir en una tabla con él a través de un bucle joblb Parallel for . Sin isolation_level=Noneembargo, tuve problemas de bloqueo hasta un set . Sin el modo de caché compartida, ¿cómo comparto instancias entre subprocesos?
Justin Dearing
1
La documentación describe las desventajas. Es especialmente peligroso si no sabes cómo evitar puntos muertos.
CL.
Llego muy tarde a la fiesta, pero este enlace es útil. manski.net/2012/10/sqlite-performance
infocyde