Introduction
SQLite utilise un verrouillage au niveau du fichier pour gérer l’accès au fichier de base de données sur le disque. L’erreur « database is locked » survient quand un processus tente d’accéder à la base de données pendant qu’un autre est en train d’y écrire. Cette situation peut se produire dans plusieurs cas, par exemple :
- Plusieurs applications accèdent à la base de données en même temps.
- Des transactions longues qui ne font pas de commit ou de rollback rapidement.
- Une mauvaise gestion des connexions et des curseurs de base de données.
Astuce : quand tu enquêtes sur des erreurs SQLite comme
"database is locked", ça aide d’ouvrir et inspecter ta base de données visuellement.Avec un client SQL de bureau comme Beekeeper Studio, tu peux ouvrir ton fichier
.db, parcourir les tableaux et relancer des requêtes de façon interactive pour vérifier que tes modifications fonctionnent.
Comment résoudre l’erreur
Solution 1 : gérer correctement les transactions
Une mauvaise gestion des transactions entraîne souvent une base de données verrouillée. Assure-toi que les transactions se terminent rapidement avec un commit ou un rollback selon le cas.
Exemple:
BEGIN TRANSACTION;
-- Insert data into the table
INSERT INTO employees (name, position) VALUES ('John Doe', 'Software Engineer');
-- Commit the transaction
COMMIT;
Résultat attendu:
Aucune sortie, mais la transaction se termine avec succès sans verrouiller la base de données.
Après le commit, c’est une bonne pratique de vérifier que ta base de données accepte de nouvelles écritures.
La capture d’écran ci-dessous montre une vérification similaire dans Beekeeper Studio : un INSERT suivi d’un SELECT confirme que les nouvelles données (ici, un enregistrement pour « Maria Lopez ») ont bien été écrites.

Solution 2 : bien utiliser la connexion à la base de données
Ferme toujours correctement la connexion à la base de données une fois les opérations terminées. Ça évite que la base reste verrouillée inutilement.
Exemple:
import sqlite3
from contextlib import closing
database_path = 'mydatabase.db'
with closing(sqlite3.connect(database_path)) as conn:
with closing(conn.cursor()) as cursor:
cursor.execute("INSERT INTO employees (name, position) VALUES (?, ?)", ('Jane Doe', 'Project Manager'))
conn.commit()
Résultat attendu:
Aucune sortie, mais l’insertion s’effectue sans verrouiller la base de données, et la connexion est correctement fermée.
Si tu préfères une interface graphique au code, Beekeeper Studio ouvre et ferme automatiquement les connexions SQLite pour toi à chaque requête, ce qui réduit le risque de laisser une base de données verrouillée.
Solution 3 : configurer un délai d’attente
Définir un délai d’attente (timeout) peut aider quand plusieurs accès simultanés sont prévus. Ça indique à SQLite combien de temps attendre avant de renvoyer l’erreur « database is locked », ce qui laisse au verrou une chance d’être libéré.
Exemple:
import sqlite3
conn = sqlite3.connect('mydatabase.db', timeout=10.0) # Set timeout to 10 seconds
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO employees (name, position) VALUES (?, ?)", ('Sam Smith', 'Data Analyst'))
finally:
cursor.close()
conn.close()
Résultat attendu:
Aucune sortie, mais le timeout laisse une marge pour surmonter les verrous temporaires.
Astuce : dans Beekeeper Studio, tu peux relancer une requête qui a échoué avec l’erreur « database is locked » pour vérifier si un timeout ou une nouvelle tentative a réglé le problème. C’est un moyen rapide de tester tes changements sans modifier le code.
Solution 4 : éviter les transactions longues
Garde tes transactions courtes pour réduire au minimum la durée de verrouillage de la base de données. Ça diminue les risques de tomber sur l’erreur « database is locked ».
Exemple:
BEGIN TRANSACTION;
INSERT INTO employees (name, position) VALUES ('Alice Johnson', 'HR Manager');
COMMIT;
Résultat attendu:
Aucune sortie, mais la transaction se termine rapidement, ce qui réduit la durée du verrou.
Conclusion
L’erreur « SQLite database is locked » est généralement le symptôme de problèmes de concurrence ou d’une mauvaise gestion des connexions et des transactions. En suivant les bonnes pratiques décrites ci-dessus (gérer efficacement les transactions, bien utiliser les connexions, définir des timeouts adaptés et éviter les transactions longues), tu peux empêcher cette erreur de se produire. Ces stratégies rendent tes opérations sur ta base SQLite à la fois robustes et efficaces.
Essaie par toi-même
Tu peux ouvrir n’importe quel fichier .db dans Beekeeper Studio pour explorer les tableaux, lancer des requêtes et vérifier que tes modifications sont bien appliquées. C’est open source, ça se connecte à plus de 20 bases de données et ça fonctionne parfaitement sur Windows, macOS et Linux.
Télécharger Beekeeper Studio →
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de bases de données, mais Beekeeper trouve l’équilibre parfait entre fonctionnalités et simplicité. Ça marche, tout simplement. »