2010-07-03 22 views
24

me han hecho algunas operaciones repetitivas en mi solicitud (probarlo), y de repente estoy recibiendo un error extraño:OperationalError: base de datos está bloqueado

OperationalError: database is locked 

He reiniciado el servidor, pero persiste el error . ¿De qué se trata todo esto?

Respuesta

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

Especifique un más largo de lo predeterminado de tiempo de espera puede ayudar a aliviar el problema: 'create_engine ('sqlite: /// {}' .formato (xxx), connect_args = { 'timeout': 15}) ' –

+0

En mi caso, había abierto el archivo con' SQLiteDatabaseBrowser.exe' ... – citynorman

13

La razón práctica para esto es a menudo que los Python o Django conchas han abierto una petición a la base de datos y no se ha cerrado correctamente; matar su acceso a la terminal a menudo lo libera. Tuve este error al ejecutar pruebas de línea de comandos hoy.

Editar: Recibo votaciones periódicas sobre esto. Si desea eliminar el acceso sin necesidad de reiniciar el terminal, luego de línea de comandos que puede hacer:

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

cómo solucionarlo sin matar la terminal? ¿Alguna idea? – neuronet

+0

@neuronet cerrar su conexión en shell? –

5

En mi caso, fue debido a que abra la base de datos SQLite desde un navegador. Cuando lo cierro desde el navegador, el problema desaparece.

+0

Gracias funcionó para mí. – an0nh4x0r

-1

probar este comando:

sudo fuser -k 8000/tcp 
+0

-1, downvoted ya que no ofrece ninguna explicación sobre cómo funciona esta solución y cómo, al tiempo que hace suposiciones sobre el puerto que se está utilizando – helplessKirk

+0

¿Le sirvió de todos modos? –

Cuestiones relacionadas