0 Pregunta: Bloqueo de toda la base de datos SQLite3 durante la actualización

pregunta creada en Wed, May 8, 2019 12:00 AM

Tengo que actualizar una base de datos SQLite3, que eliminará una tabla, la recreará y luego la rellenará. Quiero asegurarme de que todos mis otros procesos que acceden a la base de datos tienen que esperar a que se complete la transacción para evitar estar listos de una posible tabla vacía /perdida.

En este punto, mi código es así:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Mientras esto funciona, no estoy seguro de que realmente esté bloqueando el DB. He encontrado información contradictoria en línea que menciona 'BEGIN TRANSACTION EXCLUSIVE' vs 'BEGIN TRANSACTION'.

¿Puede alguien explicar qué tipo de transacción necesito para asegurar que ninguna otra lectura tenga éxito mientras la tengo bloqueada?

    
- 1
  1. La pregunta es demasiado amplia porque la respuesta depende casi completamente de sus circunstancias específicas. ¿Te estás conectando en modo WAL? ¿Es LOCKING_MODE predeterminado o exclusivo? ¿Está SHARED_CACHE_MODE habilitado? ¿El nivel de aislamiento de otras conexiones "lee sin confirmar" o no? Demasiados detalles.
    2019-05-08 17: 11: 09Z
  2. En realidad no sé nada sobre los otros procesos (cómo se escriben). Estoy tratando de actualizar la base de datos desde la línea de comandos de bash, usando un .sql que creé. Quiero asegurarme de que los otros procesos no se quejan de que falte una tabla /vacía. Así que quiero que MI archivo .sql bloquee la base de datos adecuadamente
    2019-05-08 18: 08: 27Z
  3. Con las configuraciones normales, se adquirirá un bloqueo de escritura para la tabla desplegable y no se liberará hasta que se confirme. Ninguna otra conexión puede adquirir un bloqueo hasta entonces. Pero si tiene varias conexiones que compiten por bloqueos de escritura de forma regular, debería utilizar una base de datos diferente. Muchos lectores y ocasionalmente escritores, tal vez el modo Wal.
    2019-05-08 18: 54: 32Z
  4. @ Shawn: esta actualización no es frecuente, así que está bien. No tengo control sobre la instalación de SQLite (por lo que no puedo modificar configuraciones como el modo WAL). Así que esperaba que hubiera una respuesta simple como usar "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
0 Respuestas                              0                         
fuente colocada aquí