2014-11-11 15 views
10

So weiß ich, dieses Problem ist nicht neu in Kolben, und die Leute haben schon gefragt, bevor. Wie auch immer, ich stehe immer noch vor einem Problem, während ich meine Datenbankbefehle in bash ausführe, da ich neu in python bin. Das ist, was ich tatBetriebsfehler: Datenbank ist gesperrt

import sqlite3 
conn = sqlite.connect('/home/pjbardolia/mysite/tweet_count.db') 
c = conn.cursor() 

c.execute("create table count_twitter (count_id integer primary key autoincrement ,count_present integer not null,last_tweet not null)") 

c.execute(insert into count_twitter values('',10,10)) 

jedoch nach Insert-Anweisung ausführen ich erhalte Betriebsfehler: Datenbank gesperrt ist. Kann jemand in einfachen Worten sagen, was bedeutet dieser Fehler? und wie man es löst. Vielen Dank im Voraus

+0

Nur um zu überprüfen, ist aber die letzte Zeile im Code tatsächlich: 'c.execute (" insert into count_twitter Werte ('', 10 , 10) ")"? Die [SQLite Doc-Seite] (http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked) für diesen Fehler gibt viele Hinweise. Eine Sache in Flask zu beobachten ist, vom Dev-Modus (mit "app.run()") in den Produktionsmodus zu wechseln (in einem WSGI-Server), von einzelnen Threads, die Probleme mit SQLite verursachen können und zusätzliche Concurrency-Behandlung erfordern. –

Antwort

20

Dies ist, was dieser Fehler bedeutet:

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

Wahrscheinlich haben Sie eine andere Verbindung in Ihrem Code, der nicht geschlossen ist oder nicht begangen und diese Ursache dieser Fehler. Grundsätzlich versucht man, die zweite execute zu tun, wenn sie bereits durch die andere gesperrt ist. Wenn Sie Ihre gleichzeitigen Transaktionen wirklich haben möchten, müssen Sie eine RDBMS haben.

1

stellen Sie sicher, die anderen Verbindungen unter Verwendung con.commit commit()

Verwandte Themen