web-dev-qa-db-fra.com

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

De SQLite FAQ Je sais que:

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

Donc, pour autant que je comprends, je peux: 1) Lire db à partir de plusieurs threads (SELECT) 2) Lire db à partir de plusieurs threads (SELECT) et écrire à partir d'un seul thread (CREATE, INSERT, DELETE)

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

Enfin, je me suis complètement embrouillé quand j'ai trouvé it , lorsque spécifié:

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

  • Tentative de CREATE ou DROP une table ou un index alors qu'une instruction SELECT est toujours en attente.
  • Essayer d'écrire dans une table alors qu'un SELECT est actif sur cette même table.
  • Essayer de faire deux SELECT sur 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 moi-même, il faut éviter le verrouillage? Puis-je lire et écrire en même temps à partir de deux threads différents? Merci.

10
Andrei Orlov

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 de 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é.

8
CL.