Transaktionen und virtuelle Tabellen in SQLite
(misfra.me)- Auch virtuelle Tabellen in SQLite unterstützen Schreibzugriffe und Transaktionen; dazu werden Hooks wie
xUpdate,xSync,xCommitundxRollbackimplementiert und verwendet - SQLite gewährleistet standardmäßig Atomarität über das Rollback-Journal-Verfahren; bei mehreren DB-Dateien koordiniert ein Super-Journal den gesamten Commit
- Auch virtuelle Tabellen sind in das Transaktionsprotokoll von SQLite eingebunden; schlägt
xSyncfehl, wird die gesamte Transaktion zurückgerollt - Der Commit ist in zwei Phasen aufgeteilt;
xSyncist für potenziell fehleranfällige Arbeiten zuständig, währendxCommitnur einfache Aufräumarbeiten ausführen sollte xCommitundxRollbackkönnen immer aufgerufen werden und sollten daher als fehlerfreie Aufräumfunktionen implementiert werden
Virtuelle Tabellen und Transaktionsverarbeitung in SQLite
Im vorherigen Artikel wurden die grundlegenden Methoden vorgestellt, um virtuelle Tabellen in SQLite mit Go zu registrieren und abzufragen. Dieser Artikel behandelt nun, wie man beschreibbare virtuelle Tabellen mit Transaktionsunterstützung implementiert.
Schreib- und Transaktionsunterstützung für virtuelle Tabellen
-
Die Schnittstelle für virtuelle Tabellen in SQLite ist nicht schreibgeschützt
-
Wenn der Hook
xUpdateimplementiert wird, sind Schreibzugriffe auch auf externe Datenquellen möglich -
Für echte transaktionale Konsistenz werden die folgenden Transaktions-Hooks benötigt:
xBegin: Benachrichtigung über den Beginn einer TransaktionxSync: Vorbereitung für einen sicheren Commit auf die Festplatte (schlägt dies fehl, erfolgt ein vollständiges Rollback)xCommit: Finaler Commit und AufräumenxRollback: Führt ein Rollback aus, wenn die Transaktion abgebrochen wurde
-
Selbst wenn zusammen mit normalen Tabellen oder anderen virtuellen Tabellen Änderungen vorgenommen werden, verknüpft SQLite alle Hooks, um Atomarität sicherzustellen
Interne Funktionsweise von SQLite-Transaktionen
Rollback-Journale
- SQLite speichert standardmäßig Seiten vor dem Überschreiben in einer Sicherungsdatei (Journal)
- Tritt ein Problem auf, wird aus dem Journal wiederhergestellt, wodurch Atomarität gewährleistet wird
Hinweis: SQLite unterstützt auch den WAL-Modus, dieser liegt jedoch außerhalb des Umfangs dieses Artikels
Super-Journale
-
Wenn mehrere Datenbanken eingebunden sind, ist eine Synchronisierung allein mit einzelnen Journalen pro DB schwierig
-
Eine übergeordnete Datei namens Super-Journal koordiniert den Commit über mehrere Dateien hinweg
-
Wenn nur mehrere virtuelle Tabellen innerhalb einer einzelnen DB-Datei behandelt werden, ist auch ohne Super-Journal eine Synchronisierung möglich
-
In jedem Fall ruft SQLite die Hooks
xSync,xCommitundxRollbackinnerhalb des Transaktionsablaufs automatisch auf
Two-Phase-Commit mit virtuellen Tabellen
Der Commit-Prozess in SQLite besteht aus zwei Phasen:
Phase 1: xSync (Gewährleistung von Durability)
- Alle Seiten oder Journale aller B-Bäume und DB-Dateien werden sicher auf die Festplatte synchronisiert
- Auch für virtuelle Tabellen wird jeweils der Hook
xSyncaufgerufen - Wenn auch nur ein
xSyncfehlschlägt, wird die gesamte Transaktion zurückgerollt → Atomarität bleibt erhalten
Phase 2: Aufräumen (xCommit)
-
Sobald das Schreiben auf die Festplatte abgeschlossen ist, werden Journal-Dateien gelöscht und Aufräumarbeiten für virtuelle Tabellen ausgeführt
-
Unten ist ein Teil des Codes aus
vdbeaux.czu sehendisable_simulated_io_errors(); sqlite3BeginBenignMalloc(); for(i=0; i<db->nDb; i++){ Btree *pBt = db->aDb[i].pBt; if( pBt ){ sqlite3BtreeCommitPhaseTwo(pBt, 1); } } sqlite3EndBenignMalloc(); enable_simulated_io_errors(); sqlite3VtabCommit(db); -
Innerhalb von
sqlite3VtabCommit()werden tatsächlich allexCommit-Aufrufe ignoriert, selbst wenn sie fehlschlagen → eine reine Aufräumphaseint sqlite3VtabCommit(sqlite3 *db){ callFinaliser(db, offsetof(sqlite3_module,xCommit)); return SQLITE_OK; } -
Da die Dauerhaftigkeit bereits durch
xSyncsichergestellt wurde, werden Fehler inxCommitundxRollbackignoriert
Hinweise für Entwickler virtueller Tabellen
- Dauerhafte Arbeiten müssen unbedingt in
xSyncerfolgen- Fehleranfällige Operationen wie Netzwerk-I/O oder Dateischreibvorgänge sollten hier stattfinden, damit die Transaktion sicher abgebrochen werden kann
- Auch nach
xSynckann nochxRollbackaufgerufen werden- Wenn
xSynceiner anderen Tabelle fehlschlägt, wird die gesamte Transaktion zurückgerollt
- Wenn
xCommitundxRollbacksollten als fehlerfreie Aufräumfunktionen implementiert werden- Sie sollten idempotent sein, also auch bei mehrfachen Aufrufen keinen Zustandswechsel verursachen
Fazit
- Der Journaling-Mechanismus von SQLite gewährleistet atomare Commits für alle Elemente, einschließlich normaler und virtueller Tabellen
- Die Transaktions-Hooks virtueller Tabellen sind nahtlos in den Transaktionsablauf von SQLite integriert
- Entwickler virtueller Tabellen sollten sich auf
xSynckonzentrieren, um Datenintegrität sicherzustellen, und Aufräumarbeiten aufxCommitundxRollbackaufteilen
1 Kommentare
Hacker-News-Kommentar