Comment empêcher les verrous de base de données SQLite?

10

De la FAQ SQLite, je sais que:

Plusieurs processus peuvent avoir la même base de données ouverte en même temps. Plusieurs processus peuvent faire un SELECTen même temps. Mais un seul processus peut à tout moment apporter des modifications à la base de données.

Donc, pour autant que je comprends que je peux: 1) Lire db à partir de plusieurs threads ( SELECT) 2) Lire db à partir de plusieurs threads ( SELECT) et écriture de fil unique ( CREATE, INSERT, DELETE)

Mais, j'ai lu sur la journalisation Write-Ahead qui fournit plus de simultanéité car les lecteurs ne bloquent pas les écrivains et un écrivain ne bloque pas les lecteurs . La lecture et l'écriture peuvent se dérouler simultanément.

Enfin, j'ai complètement confus quand je trouvais cela , lorsque précisé:

Voici d'autres raisons d'obtenir une erreur SQLITE_LOCKED:

  • Tentative CREATEou DROPtable ou index alors qu'une SELECTinstruction est toujours en attente.
  • Essayer d'écrire dans une table alors que a SELECTest actif sur cette même table.
  • Essayer de faire deux SELECTsur la même table en même temps dans une application multithread, si sqlite n'est pas configuré pour le faire.
  • fcntl (3, l'appel F_SETLK sur le fichier DB échoue. Cela peut être dû à un problème de verrouillage NFS, par exemple. Une solution à ce problème consiste à supprimer la base de données et à la recopier afin qu'elle ait une nouvelle valeur d'inode

Donc, je voudrais clarifier pour moi, il faut éviter le verrouillage? Puis-je lire et écrire en même temps à partir de deux threads différents? Merci.

Andrei Orlov
la source

Réponses:

8

Cette page que vous avez liée, en plus d'être assez ancienne, parle des accès à partir du même processus via la même connexion à la base de données (ou via des connexions multipe en mode cache partagé , que vous ne devez pas utiliser).

Lorsqu'il n'est pas en mode WAL, plusieurs connexions peuvent lire à partir de la même base de données, mais une transaction d'écriture est exclusive, c'est-à-dire qu'aucun autre lecteur ou écrivain n'est autorisé.

En mode WAL, un écrivain et des lecteurs ne se bloquent pas, mais il n'y a toujours qu'un seul écrivain autorisé.

CL.
la source
1
Quel est le problème avec le mode de cache partagé? J'ai pu obtenir plusieurs threads python dans le même processus pour écrire dans une table avec elle via une boucle joblb Parallel for . J'ai eu des problèmes de verrouillage jusqu'à un set isolation_level=None. Sans mode de cache partagé, comment partager des instances entre des threads?
Justin Dearing
1
La documentation décrit les inconvénients. C'est particulièrement dangereux si vous ne savez pas comment éviter les blocages.
CL.
J'arrive très tard à la fête, mais ce lien est utile. manski.net/2012/10/sqlite-performance
infocyde