Trubinial Guru hat geschrieben:Du meintest, dass die Schreiboperationen serialisiert werden müssen, wie sieht es mit den Lesezugriffen aus. Wenn die Datenbank gelocked ist, wenn gerade geschrieben wird, sollten ja auch die Lesezugriffe scheitern.
Du solltest dir das hier:
http://www.sqlite.org/sharedcache.html mal durchlesen, insbesondere die Punkte 2.1 und 2.2.*.
Wenn dir die Konsistenz der gelesenen Daten egal ist, dann kannst du den Isolation Level auf READ_UNCOMMITTED setzen und kannst parallel zu den Schreib-Operationen auch Lese-Operationen ausführen.
Wenn du dagegen beim Lesen unbedingt Inkonsistenzen vermeiden möchtest, dann solltest du den Isolation Level auf SERIALIZABLE (=default) belassen. Aber Obacht: Wenn du in diesem Level parallel zu einem Schreib-Thread zu lesen versuchst, dann bekommst du den bekannten Zugriffs-Fehler. Deswegen solltest du die Lese-Aufträge über dieselbe Priotity-Queue wie die Schreib-Aufträge schicken, dann wird der Thread, der aus ihr liest, zum Kommunikations-Zentrum mit der DB, ungefähr so:
Code: Alles auswählen
def db_thread(queue): # war: writer()
while True:
priority, data, result_queue = queue.get()
if result_queue is not None:
result = ... select *** from ---
result_queue.put(result)
else:
... write data somewhere ...
def query(db_queue, importance, *params):
result_queue = Queue.Queue()
db_queue.put((importance, ...select stmt..., result_queue))
return result_queue.get() # blockt bis das Ergebnis da ist
def super_important_stuff(queue):
while True:
data = ... get super important data ...
queue.put((SUPER_IMPORTANT, data, None))
...
my_data = query(SUPER_IMPORTANT, queue, bla, fasel)
Die
queue in der letzten Zeile ist die Priority-Queue aus
main() in meinem andere Beitrag oben. Die muss halt irgendwo zentral zugänlich sein.
Inwieweit das alles skaliert, weiß ich allerdings nicht. Das musst du ausprobieren. Ich hab mal bei einer Firma gearbeitet, da wurde das Verhalten des Programms bei möglichen konkurrierenden Zugriffen so getestet:
Alle Programmierer bitte:
- 14:30 - 14:45: Rechnungen anlegen
- 15:00 - 15:15: Aufträge bestätigen
- 15:30 - 15:45: Mahn-Aufträge anlegen
- ...
*brrr*
In specifications, Murphy's Law supersedes Ohm's.