Dalle domande frequenti su SQLite ho saputo che:
Più processi possono avere lo stesso database aperto contemporaneamente. Più processi possono essere eseguiti
SELECT
contemporaneamente. Tuttavia, solo un processo può apportare modifiche al database in qualsiasi momento.
Quindi, per quanto ho capito che posso: 1) Leggi db da più thread ( SELECT
) 2) Leggi db da più thread ( SELECT
) e write da unico filo ( CREATE
, INSERT
, DELETE
)
Ma ho letto di Scrivere in anticipo che fornisce più concorrenza poiché i lettori non bloccano gli scrittori e uno scrittore non blocca i lettori . La lettura e la scrittura possono procedere contemporaneamente.
Infine, ho completamente confuso quando ho scoperto che , quando specificato:
Ecco altri motivi per ottenere un errore SQLITE_LOCKED:
- Prova a
CREATE
oDROP
una tabella o un indice mentreSELECT
un'istruzione è ancora in sospeso.- Tentativo di scrivere su una tabella mentre a
SELECT
è attivo su quella stessa tabella.- Provando a fare due
SELECT
sulla stessa tabella contemporaneamente in un'applicazione multithread, se sqlite non è impostato per farlo.- fcntl (3, la chiamata F_SETLK sul file DB ha esito negativo. Ciò potrebbe essere causato, ad esempio, da un problema di blocco NFS. Una soluzione a questo problema è rimuovere il DB e copiarlo nuovamente in modo che abbia un nuovo valore Inode
Quindi, vorrei chiarire da solo, è necessario evitare il blocco? Posso leggere e scrivere contemporaneamente da due thread diversi? Grazie.
isolation_level=None
però. Senza la modalità cache condivisa, come posso condividere istanze tra thread?