0 Frage: Sperrung der gesamten SQLite3-Datenbank während des Updates

Frage erstellt am Wed, May 8, 2019 12:00 AM

Ich muss eine SQLite3-Datenbank aktualisieren, die eine Tabelle löscht, neu erstellt und die Tabelle dann erneut auffüllt. Ich möchte sicherstellen, dass alle anderen Prozesse, die auf die Datenbank zugreifen, auf den Abschluss der Transaktion warten müssen, um zu verhindern, dass eine potenzielle leere /fehlende Tabelle angezeigt wird.

Zu diesem Zeitpunkt sieht mein Code folgendermaßen aus:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Obwohl dies funktioniert, bin ich mir nicht sicher, ob ich die Datenbank wirklich sperren soll. Ich habe im Internet widersprüchliche Informationen gefunden, die "BEGIN TRANSACTION EXCLUSIVE" und "BEGIN TRANSACTION" erwähnen.

Kann jemand erklären, welcher Transaktionstyp erforderlich ist, um sicherzustellen, dass keine anderen Lesevorgänge erfolgreich sind, während ich sie gesperrt habe?

    
- 1
  1. Die Frage ist zu weit gefasst, da die Antwort fast ausschließlich von Ihren spezifischen Umständen abhängt. Stellen Sie eine Verbindung im WAL-Modus her? Ist der LOCKING_MODE Standard oder exklusiv? Ist SHARED_CACHE_MODE aktiviert? Wird die Isolationsstufe anderer Verbindungen "nicht festgeschrieben" gelesen oder nicht? Zu viele Details.
    2019-05-08 17: 11: 09Z
  2. Ich weiß eigentlich nichts über die anderen Prozesse (wie sie geschrieben sind). Ich versuche, die Datenbank über die Bash-Befehlszeile mit einer von mir erstellten .sql-Datei zu aktualisieren. Ich möchte sicherstellen, dass sich die anderen Prozesse nicht über eine fehlende /leere Tabelle beschweren. Daher möchte ich, dass MEINE .sql-Datei die Datenbank entsprechend sperrt
    2019-05-08 18: 08: 27Z
  3. Bei normalen Einstellungen wird eine Schreibsperre für die Drop-Tabelle aktiviert und erst beim Festschreiben freigegeben. Bis dahin kann keine andere Verbindung eine Sperre erhalten. Wenn Sie jedoch mehrere Verbindungen haben, die regelmäßig um Schreibsperren kämpfen, sollten Sie eine andere Datenbank verwenden. Viele Leser und gelegentlich Schriftsteller, vielleicht Wal-Modus.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - dieses Update kommt nicht häufig vor, das ist also in Ordnung. Ich habe keine Kontrolle über die SQLite-Installation (daher kann ich Einstellungen wie den WAL-Modus nicht ändern.) Ich hatte also die Hoffnung, dass es eine einfache Antwort wie "BEGIN TRANSACTION XXX"
    gibt
    2019-05-09 00: 12: 19Z
0 Antworten                              0                         
Quelle platziert Hier