2010-07-03 3 views
24

J'ai fait quelques opérations répétitives dans ma demande (test), et je reçois soudainement une erreur bizarre:OperationalError: base de données est verrouillé

OperationalError: database is locked 

J'ai redémarré le serveur, mais l'erreur persiste . Que peut-il être tout?

Répondre

41

De django doc:

SQLite is meant to be a lightweight database, and thus can't support a high level of concurrency. OperationalError: database is locked errors indicate that your application is experiencing more concurrency than sqlite can handle in default configuration. This error means that one thread or process has an exclusive lock on the database connection and another thread timed out waiting for the lock the be released.

Python's SQLite wrapper has a default timeout value that determines how long the second thread is allowed to wait on the lock before it times out and raises the OperationalError: database is locked error.

If you're getting this error, you can solve it by:

Switching to another database backend. At a certain point SQLite becomes too "lite" for real-world applications, and these sorts of concurrency errors indicate you've reached that point.

Rewriting your code to reduce concurrency and ensure that database transactions are short-lived.

Increase the default timeout value by setting the timeout database option optionoption

http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption

+1

spécifier un délai plus long que par défaut peut aider à soulager le problème: 'create_engine ('sqlite: /// {} .format (xxx), connect_args = { 'timeout': 15}) ' –

+0

Dans mon cas, j'avais ouvert le fichier avec' SQLiteDatabaseBrowser.exe' ... – citynorman

13

La raison pratique pour ce qui est souvent que les coquilles de python ou django ont ouvert une demande à la DB et il n'a pas été correctement fermée; tuer votre accès terminal le libère souvent. J'ai eu cette erreur sur l'exécution des tests de ligne de commande aujourd'hui.

Editer: Je reçois des pense-bêtes périodiques à ce sujet. Si vous souhaitez tuer un accès sans redémarrer le terminal, puis de CommandLine pouvez faire:

from django import db 
db.connections.close_all() 
+1

comment le réparer sans tuer le terminal? Une idée? – neuronet

+0

@neuronet ferme ta connexion en shell? –

5

Dans mon cas, ce fut parce que j'ouvre la base de données à partir du navigateur SQLite. Lorsque je le ferme à partir du navigateur, le problème est parti.

+0

Merci cela a fonctionné pour moi. – an0nh4x0r

-1

essayez cette commande:

sudo fuser -k 8000/tcp 
+0

-1, Downvoted car il n'offre aucune explication quant à ce que fait cette solution et comment, tout en formulant également des hypothèses sur le port utilisé – helplessKirk

+0

Cela a-t-il aidé de toute façon? –

Questions connexes