2012-04-26 20 views
44

Tengo una base de datos SQLite que es utilizada por dos procesos. Me pregunto, con la versión más reciente de SQLite, mientras un proceso (conexión) inicia una transacción para escribir en la base de datos ¿podrá el otro proceso leer desde la base de datos simultáneamente?¿Puedo leer y escribir simultáneamente en una base de datos SQLite desde múltiples conexiones?

+0

pregunta relacionada ver aquí .. http: // stackoverflow.com/questions/12117016/strategies-for-concurrent-read-writing-and-reading-in-sqlite/24038860 # 24038860 – Nepster

Respuesta

76

I recopilado información de diversas fuentes, principalmente de sqlite.org, y ponerlos juntos:

En primer lugar, por defecto, varios procesos pueden tener la misma base de datos SQLite abierta, al mismo tiempo, y varios accesos de lectura puede estar satisfecho en paralelo.

En caso de escritura, una sola escritura en la base de datos bloquea la base de datos durante un tiempo corto, nada, ni siquiera la lectura, puede acceder al archivo de la base de datos en absoluto.

A partir de la versión 3.7.0, está disponible una nueva opción “Write Ahead Logging” (WAL), en la que la lectura y la escritura pueden continuar simultáneamente.

De forma predeterminada, WAL no está habilitado. Para activar WAL, consulte la documentación de SQLite.

+0

journal_mode = ¡WAL resuelve mi problema! –

11

SQLite3 permite explícitamente multiple connections:

(5) ¿Puede múltiples aplicaciones o varias instancias de la misma aplicación el acceso un único archivo de base de datos al mismo tiempo?

Múltiples procesos pueden tener la misma base de datos abierta al mismo tiempo. Múltiples procesos pueden estar haciendo SELECCIONAR al mismo tiempo. Pero solo un proceso puede estar haciendo cambios en la base de datos en cualquier momento en el tiempo , sin embargo.

Para compartir conexiones, utilice SQLite3 shared cache:

partir de la versión 3.3.0, SQLite incluye un modo especial "-caché compartida" (desactivado por defecto)

En la versión 3.5.0, el modo de caché compartida se modificó para que el mismo caché se pueda compartir en un proceso completo en lugar de solo dentro de un solo subproceso .

5.0 Activación Shared-caché Modo

modo de caché compartida está habilitado en función de cada proceso. Mediante la interfaz de C , la siguiente API se puede utilizar para permitir a nivel mundial o desactivar el modo de -cache compartida:

int sqlite3_enable_shared_cache (int);

Cada llamada sqlite3_enable_shared_cache() efectos de bases de datos posterior conexiones creadas usando(), sqlite3_open16 sqlite3_open(), o sqlite3_open_v2(). Las conexiones de bases de datos que ya existen son no afectadas. Cada llamada a sqlite3_enable_shared_cache() anula todas las llamadas anteriores dentro del mismo proceso.

Cuestiones relacionadas