10
votes

Python / SQLite - Base de données verrouillée malgré de grandes délais d'attente

Je suis sûr que je manque quelque chose de très évident, mais je ne peux pas que la vie de moi, arrêtez mes scripts de Pysqlite s'écraser avec une base de données est une erreur verrouillée. J'ai deux scripts, un pour charger des données dans la base de données et une pour lire les données, mais les deux vont fréquemment, et instantanément, en fonction de ce que l'autre effectue avec la base de données à tout moment. J'ai le délai d'attente sur les deux scripts défini à 30 secondes:

cx = sqlite.connect("database.sql", timeout=30.0)


0 commentaires

4 Réponses :


0
votes

SQLite utilise le verrouillage de la base de données pour chaque écriture (mise à jour / insérer / Supprimer / ...). IMHO, ce verrou est maintenu jusqu'à la fin de la transaction. Ceci est une seule serrure maintenue à travers les threads / procédés, AFaik.

Donc, j'essayerais de mettre fin explicitement la transaction et la connexion pour la rédaction de script et de commettre explicitement dans le script de lecture et d'essayer de déboguer des problèmes de concurrence.


4 commentaires

Vous voulez fermer toute la base de données? Je vais bien avec une serrure tenue, mais aucun script n'attend que suffisamment de temps pour que le verrou soit libéré.


Oui, je veux dire une connexion proche de la base de données de la connexion qui fait écrit.


Eh bien, j'écris à la base de données toutes les quelques secondes, la fermeture sûre ne changera pas vraiment quoi que ce soit? Il y a des travaux supplémentaires dans l'ouverture et la fermeture, de même que cela ne pourrait-il pas s'aggraver? Et aussi si je commémore les changements avant de fermer, il n'y a aucun avantage à la clôturer de toute façon, car il ne serait plus verrouillé.


Bien sûr - je n'étais que sur la question que vous êtes sûr qu'il n'y a pas de conditions de course. Mais comme je l'ai lu maintenant - votre application est relativement lue écrite et simultanée des lectures et des écrires et des écritures simultanées ne sont pas bonnes pour SQLite, donc pour ce cas d'utilisation, je modifierais la base de données.



1
votes

SQLite n'est tout simplement pas optimisé pour les charges de travail lourdes, ni ne prétendent être (mais cela ne vous dérange pas beaucoup en une seule transaction). Cela me semble que vous semblez peut-être d'arriver au point où vous devez passer à une autre base de données comme MySQL, PostgreSQL, Oracle ou DB2. Certaines de ces options sont effectivement chères, mais pour certaines charges de travail, c'est ce dont vous avez besoin. (Notez également que les charges de travail lourdes-lourdes ont tendance à être mieux réalisées avec une solution de serveur de base de données dédiée également, malgré le fait que cela pousse les coûts de déploiement et la complexité. Certaines choses simplement coût .) .


2 commentaires

Je préférerais certainement utiliser une base de données appropriée, mais il n'est tout simplement pas disponible pour diverses raisons.


Eh bien, alors soyez prêt pour que certaines choses soient lentes. Cela ne peut tout simplement pas être aidé.



6
votes

dans les premières versions de PYSQLITE, le paramètre Timeout à sqlite.connect est apparemment interprété comme millisecondes. Donc, votre expression timeout = 30.0 doit être timeout = 30000 .


1 commentaires

Je ne pense pas que c'est vrai, c'est des secondes. Veuillez vérifier docs.python.org/2/library/sqlite3.html



0
votes

Votre SQLite3 peut être compilé sans avoir_usleep qui fait attendre des threads simultanés pendant les secondes avant de réessayer. https://beets.io/blog/sqlite-nightmare.html


0 commentaires