web-dev-qa-db-fra.com

SQLite avec deux processus python y accédant: une lecture, une écriture

Je développe un petit système avec deux composants: l'un interroge les données d'une ressource Internet et les traduit en données sql pour les conserver localement; le second lit les données sql de l'instance locale et les sert via json et une api reposante.

Je prévoyais à l'origine de conserver les données avec postgresql, mais parce que l'application aura un très faible volume de données à stocker et du trafic à servir, je pensais que c'était exagéré. SQLite est-il à la hauteur? J'aime l'idée de la petite empreinte et pas besoin de maintenir un autre serveur SQL pour cette seule tâche, mais je suis préoccupé par la concurrence.

Il semble que lorsque la consignation en écriture anticipée est activée, la lecture et l'écriture simultanées d'une base de données SQLite peuvent se produire sans verrouiller l'un ou l'autre processus de la base de données.

Une seule instance SQLite peut-elle soutenir deux processus simultanés y accédant, si un seul lit et l'autre écrit? J'ai commencé à écrire le code mais je me demandais s'il s'agissait d'une mauvaise application de SQLite.

22
b.b.

Vous recherchez la documentation File Locking And Concurrency .

Les processus SQLite utilisent une série de verrous pour gérer la concurrence; à lire, plusieurs processus peuvent obtenir un verrou SHARED.

Un processus qui écrit, devra obtenir un verrou RESERVED, et ce n'est que lorsqu'il doit réellement vider les modifications sur le disque qu'il passe à l'état PENDING. Tout processus de lecture devra ensuite déverrouiller le fichier, après quoi le processus d'écriture pourra se déplacer vers EXCLUSIVE pour écrire dans le fichier de base de données réel.

Étant donné que le processus d'écriture n'a besoin que de verrouiller le fichier de base de données pour les écritures réelles (vidages de mémoire, validations), une configuration avec un seul lecteur et un seul écrivain fonctionnera assez bien. Je m'attends à ce qu'il fonctionne aussi bien, sinon mieux, en tant que configuration avec un seul processus effectuant toutes les tâches de lecture et d'écriture.

SQLite est moins adapté lorsque plusieurs processus écrivent fréquemment dans la même base de données, car l'écriture nécessite l'obtention du verrou exclusif PENDING pour sérialiser les modifications.

25
Martijn Pieters

Je voulais juste faire un suivi et faire savoir à tout le monde que la mise en œuvre a réussi. Travailler avec SQLite a été un vrai plaisir, et avec un seul processus à l'écrire à la fois, nous n'avons jamais eu de problèmes de verrouillage ... même avec des lectures simultanées très rapides à partir d'un processus secondaire.

10
b.b.