web-dev-qa-db-fra.com

Pourquoi les écritures simultanées ne sont-elles pas autorisées sur une base de données SQLite?

Je fais de la programmation de base de données en utilisant Java avec SQLite.

J'ai constaté qu'une seule connexion à la fois à la base de données a des capacités d'écriture, tandis que de nombreuses connexions à la fois ont une capacité de lecture.

Pourquoi l'architecture de SQLite a-t-elle été conçue ainsi? Tant que les deux choses en cours d'écriture ne sont pas écrites au même endroit dans la base de données, pourquoi deux écritures ne peuvent-elles pas se produire simultanément?

80
SteelToe

Parce que "plusieurs écritures simultanées" est beaucoup, beaucoup plus difficile à réaliser dans le moteur de base de données de base que le lecteur unique à lecteurs multiples. C'est au-delà des paramètres de conception de SQLite, et l'inclure pourrait probablement renverser la taille et la simplicité délicieusement petites de SQLite.

La prise en charge de degrés élevés de concurrence en écriture est une caractéristique des grands moteurs de base de données tels que DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL et Sybase. Mais c'est techniquement difficile à accomplir, nécessitant un contrôle étendu de la concurrence et des stratégies d'optimisation telles que le verrouillage des bases de données, des tables et des lignes ou, dans les implémentations plus modernes, contrôle de concurrence multi-version . La recherche sur ce problème/exigence est volumineuse et remonte à décennies .

SQLite a une philosophie de conception très différente de la plupart de ces SGBD centrés sur le serveur qui prennent en charge plusieurs écrivains. Il est conçu pour apporter la puissance de SQL et du modèle relationnel à des applications individuelles, et en fait pour être intégré dans chaque application. Cet objectif nécessite des compromis importants. Ne pas ajouter l'infrastructure et les frais généraux importants nécessaires pour gérer plusieurs écrivains simultanés en fait partie.

La philosophie peut être résumée par une déclaration sur la page des utilisations appropriées de SQLite:

SQLite n'est pas en concurrence avec les bases de données client/serveur. SQLite est en concurrence avec fopen ().

159
Jonathan Eunice

Parce qu'il n'y a pas de serveur qui puisse dire si les choses doivent être écrites au même endroit ou non. Deux processus seulement essaient d'écrire dans un fichier.

Comme indiqué dans un commentaire, les écritures simultanées peuvent également être prises en charge par un thread interne. Je ne sais pas dans quelle mesure cela fonctionnerait (je n'y ai pas beaucoup réfléchi non plus). Quoi qu'il en soit, voici pourquoi SQLite n'utilise pas de threads: le Dr Hipp pense que les threads sont mauvais.

Le fait que DR Hipp pense que les threads sont mauvais est documenté dans le SQLite FAQ .

12
Stop harming Monica