2010-07-03 14 views
24

Zrobiłem kilka powtarzających się operacji w mojej aplikacji (testowanie go), i nagle dostaję dziwny błąd:OperationalError: Baza danych jest zablokowana

OperationalError: database is locked 

Mam ponownym uruchomieniu serwera, ale błąd nie ustępuje . O co w tym wszystkim chodzi?

Odpowiedz

41

Od 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

Określ dłużej niż domyślny limit czasu może przyczynić się do złagodzenia problemu: 'create_engine ('sqlite: /// {}' .format (xxx), connect_args = { 'timeout': 15}) ' –

+0

W moim przypadku otworzyłem plik z' SQLiteDatabaseBrowser.exe' ... – citynorman

13

Praktycznym powodem jest to, że często lub Python Django muszle otworzyły wniosek do DB i nie został poprawnie zamknięty; zabicie twojego terminalu często go zwalnia. Miałem ten błąd podczas uruchamiania testów wiersza poleceń dzisiaj.

Edycja: Dostaję okresowe przegrane w tej sprawie. Jeśli chcesz, aby zabić dostęp bez restartu terminala, a następnie od poleceń można zrobić:

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

jak to naprawić bez zabijania terminala? Dowolny pomysł? – neuronet

+0

@neuronet zamknąć połączenie w powłoce? –

5

W moim przypadku, to dlatego, że od otwarcia bazy danych SQLite Browser. Kiedy zamykam go z przeglądarki, problem zniknął.

+0

Dzięki to zadziałało dla mnie. – an0nh4x0r

-1

spróbować tej komendy:

sudo fuser -k 8000/tcp 
+0

-1, Rewizja nie zawiera wyjaśnień co do tego, jak to rozwiązanie działa i jak, jednocześnie przyjmując założenia dotyczące używanego portu. – helplessKirk

+0

Czy to pomogło? –