🔒Journal, WAL und Sperren
SQLite ist ACID: Eine Transaktion wird ganz oder gar nicht wirksam – auch bei Absturz oder Stromausfall mitten im Schreiben. Dafür gibt es zwei Verfahren: das klassische Rollback-Journal und seit Version 3.7.0 (2010) das Write-Ahead-Log. Quellen: sqlite.org/atomiccommit.html, /lockingv3.html, /wal.html.
🪜Sperrzustände (Rollback-Journal-Modus)
Keine Sperre. Die Datei darf weder gelesen noch geschrieben werden.
Lesen erlaubt. Beliebig viele Verbindungen gleichzeitig.
Schreibabsicht. Nur eine Verbindung; Leser dürfen weiter kommen und gehen. Änderungen liegen erst im Cache + Journal.
Warten auf Leser. Keine neuen SHARED-Sperren mehr – verhindert, dass Schreiber „verhungern“.
Schreiben in die Datenbankdatei. Kein anderer darf irgendeine Sperre halten.
📓Rollback-Journal als Zeitleiste
Ausgangslage
Niemand hat die Datei geöffnet. Seiten 1–3 haben den Stand v1.
📜Write-Ahead-Log als Zeitleiste
Ausgangslage
journal_mode=WAL. Datenbankdatei mit Seiten 1–3 in Version v1, das WAL ist leer.
✔ = Commit-Frame · grün = schon zurückgeschrieben · blass = noch nicht committet
🧪WAL-Labor
✔ = Commit-Frame · grün = schon zurückgeschrieben · blass = noch nicht committet
Kopf: Magic 0x377f0682 · Version 3007000 · Seitengröße · Checkpoint-Nr. · Salz 1 + 2 · Prüfsumme. Frame: Seitennummer · DB-Größe nach Commit (≠ 0 nur beim Commit-Frame) · Salze · laufende Prüfsumme.
⚖️Journal oder WAL?
| Rollback-Journal (DELETE, TRUNCATE, PERSIST) | WAL | |
|---|---|---|
| Wohin schreibt ein Commit? | direkt in die Datenbankdatei (vorher Originale ins Journal) | ans Ende der -wal-Datei |
| Leser während des Schreibens | bis PENDING ja, dann blockiert | immer – jeder Leser hat seinen Schnappschuss |
| Gleichzeitige Schreiber | einer | einer |
| fsyncs je Commit (synchronous=FULL) | mehrere (Journal, Datenbank, Löschen) | einer auf das WAL (bei NORMAL keiner – erst beim Checkpoint) |
| Zusatzdateien | -journal (nur während Transaktionen) | -wal und -shm (dauerhaft, solange geöffnet) |
| Netzlaufwerk | möglich, wenn Dateisperren zuverlässig sind | nein – der wal-index braucht gemeinsamen Speicher auf einem Rechner |
| Große Transaktionen | gut | WAL wächst entsprechend; Checkpoint danach |