2008-12-18 8 views
7

Ich traf mit einem seltsamen Problem über sqlite3. Ich habe verschiedene Verbindungen der gleichen Datenbankdatei mit der Methode open() erhalten. Verbindung 1 beginnt eine Transaktion und Verbindung 2 beginnt eine andere Transaktion, die mehrere Datensätze einer Tabelle aktualisieren soll. Dann commit Verbindung 1 die Transaktion, gefolgt von Verbindung 2 commit ihre Transaktion. Aber ich habe festgestellt, dass der Update-Befehl von Verbindung 2 den Datensatz in der Datenbank nie wirklich aktualisiert. Während dieses Vorgangs wird keine Ausnahme ausgelöst. Ich weiß nicht, warum das Problem auftritt. Kann mir jemand den Grund erklären?Können verschiedene Verbindungen der gleichen SQLite-Datenbank Transaktionen gleichzeitig starten?

Antwort

14

Wenn Sie die SQLite-Dokumentation lesen, werden Sie sehen, dass es mehrere Verbindungen nur zum Lesen unterstützt. Sie können nicht aus mehreren Verbindungen in die Datenbank schreiben, da dies nicht dafür gedacht ist.

http://www.sqlite.org/faq.html#q5

+1

Sie können jedoch zwei gleichzeitige Schreibtransaktionen haben, was das Problem verursacht. –

+0

Wenn also eine Transaktion eine Schreiboperation für die Datenbank ausführt, können alle anderen Schreiboperationen die Datenbank nicht ändern, unabhängig davon, ob diese Operationen in einer Transaktion enthalten sind oder nicht. – user26404

+0

Kann ich eine Auswahloperation ausführen, wenn eine andere Verbindung gleichzeitig eine Schreiboperation (Einfügen, Aktualisieren) ausführt? – user26404

5

Sofern Sie den sofortigen Einsatz BEGIN Ihre Transaktionen zu initiieren, laufen Sie Gefahr, dass sie rückgängig zu machen und wieder versuchen. A BEGIN macht keine Verriegelung; Das nachfolgende UPDATE oder INSERT ruft die Sperre ab und Sie müssen den Ergebniscode überprüfen, um festzustellen, ob sie fehlgeschlagen sind. Siehe diese Seite unter transactions und diese auf locks.

Verwandte Themen