2010-07-03 37 views
24

Tôi đã thực hiện một số thao tác lặp đi lặp lại trong ứng dụng của tôi (thử nghiệm nó), và đột nhiên tôi nhận được một lỗi lạ:OperationalError: cơ sở dữ liệu bị khóa

OperationalError: database is locked 

Tôi đã khởi động lại máy chủ, nhưng lỗi vẫn còn . Nó có thể là gì?

Trả lời

41

Từ 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

Chỉ định còn hơn mặc định thời gian chờ có thể giúp giảm bớt các vấn đề: 'create_engine ('sqlite: /// {}' .format (xxx), connect_args = { 'timeout': 15}) ' –

+0

Trong trường hợp của tôi, tôi đã mở tệp bằng' SQLiteDatabaseBrowser.exe' ... – citynorman

13

Lý do thực tiễn cho việc này thường là python hoặc django vỏ đã mở một yêu cầu đến DB và nó đã không được đóng đúng; giết chết truy cập đầu cuối của bạn thường giải phóng nó. Tôi đã gặp lỗi này khi chạy thử nghiệm dòng lệnh ngay hôm nay.

Chỉnh sửa: Tôi nhận được upvotes định kỳ về điều này. Nếu bạn muốn xóa quyền truy cập mà không cần khởi động lại thiết bị đầu cuối, sau đó từ dòng lệnh bạn có thể làm:

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

cách sửa nó mà không cần phải giết thiết bị đầu cuối? Bất kỳ ý tưởng? – neuronet

+0

@neuronet đóng kết nối của bạn trong trình bao? –

5

Trong trường hợp của tôi, Đó là vì tôi mở cơ sở dữ liệu từ Trình duyệt SQLite. Khi tôi đóng nó khỏi trình duyệt, vấn đề đã biến mất.

+0

Cảm ơn nó đã làm việc cho tôi. – an0nh4x0r

-1

thử lệnh này:

sudo fuser -k 8000/tcp 
+0

-1, Downvoted vì nó cung cấp không có giải thích như những gì giải pháp này không và làm thế nào, trong khi cũng làm cho các giả định về cổng đang được sử dụng – helplessKirk

+0

Nó có giúp gì không? –

Các vấn đề liên quan