2016-12-14 4 views
0

Ich habe die SQLite-Dokumentation gelesen und auch Code referenziert, den ich vorher geschrieben habe, aber ich bin anscheinend nicht in der Lage, eine definitive Antwort auf etwas zu finden, was ich mir als eine ziemlich einfache Frage vorstelle.Wie werden Transaktionen in SQLite partitioniert/isoliert?

Ich möchte viele (separate) kompilierte Anweisungen innerhalb einer Transaktion ausführen, aber untergeordnete Threads können auch Transaktionen erstellen oder Anweisungen gleichzeitig ausführen, und ich möchte nicht, dass sie in diese bestimmte Transaktion einbezogen werden. Momentan habe ich ein einzelnes Datenbank-Handle, das ich zwischen allen Threads teile.

Also, meine Frage ist,

1) .. ist es besser, im Allgemeinen um Transaktionen eine Art von Semaphore haben sie mit anderen Anweisungen wird ausgeführt gegen einen Datenbank-Handle kollidieren/sammeln nicht zu gewährleisten. Ich marschiere bereits, um Probleme mit Multithread-Problemen mit SQLite zu verhindern (obwohl es mit WAL jetzt sehr schwierig ist, es überhaupt zu verunsichern).

2) .. oder wird erwartet, dass Sie mehrere Datenbankverbindungen öffnen und die Transaktionen pro Datenbankverbindung starten/festschreiben, wenn sie gleichzeitig ausgeführt werden?

+0

Ah Entschuldigung, ich war auch nicht in der Lage, wie es als ein Duplikat markiert wurde. Werde das jetzt tun. Vielen Dank. –

Antwort

0

Änderungen in einer Datenbankverbindung sind für alle anderen Datenbankverbindungen vor dem Festschreiben unsichtbar.

So scheint es ein hybrider Ansatz mit mehreren Verbindungen offen für die Datenbank bietet angemessene Parallelität Garantien, Handel die Kosten der Eröffnung einer neuen Verbindung mit dem Vorteil der Multi-Thread-Schreib-Transaktionen.

Eine Abfrage zeigt alle Änderungen an, die in derselben Datenbankverbindung vor dem Start der Abfrage ausgeführt wurden, unabhängig davon, ob diese Änderungen festgeschrieben wurden oder nicht.

Wenn Änderungen an derselben Datenbankverbindung auftreten, nachdem eine Abfrage gestartet wurde, aber bevor die Abfrage abgeschlossen wird, ist nicht definiert, ob die Abfrage diese Änderungen anzeigen wird.

Wenn Änderungen an derselben Datenbankverbindung auftreten, nachdem eine Abfrage gestartet wurde, aber bevor die Abfrage abgeschlossen wird, gibt die Abfrage möglicherweise eine geänderte Zeile mehrmals zurück oder gibt eine zuvor gelöschte Zeile zurück.

Für die vorherigen vier Elemente gelten zwei Datenbankverbindungen, die denselben gemeinsam genutzten Cache verwenden und die PRAGMA read_uncommitted aktivieren, als dieselbe Datenbankverbindung, keine separaten Datenbankverbindungen.


Hier ist die SQLite information on isolation. Das ist außerordentlich nützlich, um für dieses Problem zu lesen und zu verstehen.

Verwandte Themen