Come posso impedire i blocchi del database SQLite?


10

Dalle domande frequenti su SQLite ho saputo che:

Più processi possono avere lo stesso database aperto contemporaneamente. Più processi possono essere eseguiti SELECTcontemporaneamente. 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 CREATEo DROPuna tabella o un indice mentre SELECTun'istruzione è ancora in sospeso.
  • Tentativo di scrivere su una tabella mentre a SELECTè attivo su quella stessa tabella.
  • Provando a fare due SELECTsulla 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.

Risposte:


8

Quella pagina che hai collegato, oltre ad essere piuttosto vecchia, parla degli accessi dallo stesso processo attraverso la stessa connessione al database (o tramite connessioni multipe nella modalità cache condivisa , che non dovresti usare).

Quando non è in modalità WAL, più connessioni possono leggere dallo stesso database, ma una transazione di scrittura è esclusiva, ovvero non sono ammessi altri lettori o scrittori.

In modalità WAL, uno scrittore e i lettori non si bloccano a vicenda, ma è ancora consentito solo uno scrittore.


1
Cosa c'è di sbagliato nella modalità cache condivisa? Sono stato in grado di ottenere più thread Python nello stesso processo per scrivere su una tabella con esso tramite un joblb Parallel per loop . Ho avuto problemi di blocco fino a quando un set isolation_level=Noneperò. Senza la modalità cache condivisa, come posso condividere istanze tra thread?
Justin Dearing il

1
La documentazione descrive gli svantaggi. È particolarmente pericoloso se non sai come evitare i deadlock.
CL.

Arriva molto tardi alla festa, ma questo link è utile. manski.net/2012/10/sqlite-performance
infocyde
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.