Layer 8Ehrlicher Tech-Support
SoftwareSchweregrad: Lästigdatabase is locked

SQLite: database is locked

SQLite meldet „database is locked“? Sie erlaubt nur einen Schreiber — ein hängender Zugriff oder ein Netzlaufwerk bringt sie ins Stocken.

Aufwand:
ca. 25 Min.

Das Symptom

Eine Anwendung, die auf SQLite setzt, bricht sporadisch mit database is locked ab — mal beim Speichern, mal bei einem Hintergrundvorgang. Unter geringer Last läuft alles, aber sobald mehrere Zugriffe zusammenkommen oder ein zweiter Prozess mitschreibt, häufen sich die Sperren.

Die „Layer 8“-Wahrheit

SQLite ist bewusst schlank: keine Serversoftware, nur eine Datei. Dieser Charme hat eine klare Grenze — beim Schreiben darf zu jedem Zeitpunkt nur ein einziger Vorgang ran. Lesen können viele gleichzeitig, aber sobald zwei zur selben Zeit schreiben wollen, muss einer warten, und wartet er zu lange, kommt „database is locked“. Der Fehler ist also kein Zeichen von Kaputtheit, sondern die eingebaute Regel, die verhindert, dass sich zwei Schreiber die Datei zerreißen.

Die häufigste vermeidbare Ursache ist ein Vorgang, der die Sperre nicht wieder loslässt — eine Transaktion, die offen blieb, oder ein abgestürzter Prozess, der sie mit ins Grab nahm. Kurze, sauber abgeschlossene Transaktionen entschärfen das schon weitgehend, und der WAL-Modus nimmt Lesern und Schreibern viel Reibung. Der eine Fehler, den man nie machen sollte: eine SQLite-Datei auf einem Netzlaufwerk betreiben — dort funktioniert die Sperre grundsätzlich unzuverlässig, und dann ist eine echte Server-Datenbank ohnehin das passendere Werkzeug.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Das Ein-Schreiber-Prinzip verstehen

    SQLite ist eine Datei-Datenbank ohne Server. Sie erlaubt beliebig viele gleichzeitige Leser, aber immer nur einen Schreiber. Will ein zweiter Vorgang schreiben, während der erste die Sperre hält, meldet SQLite „database is locked“. Das ist kein Defekt, sondern das Schutzprinzip.

  2. 2.

    Hängende Verbindungen finden

    Oft hält ein Prozess die Sperre, weil er eine Transaktion offen ließ oder abgestürzt ist, ohne sie zu schließen. Prüfen, welche Prozesse die Datenbankdatei geöffnet haben, und einen hängenden gezielt beenden:

    fuser meine.db
    
  3. 3.

    Transaktionen kurz halten und sauber schließen

    Im Code jede schreibende Transaktion so kurz wie möglich halten und zuverlässig abschließen (commit) oder zurückrollen. Eine offen vergessene Transaktion blockiert alle anderen Schreiber, bis sie beendet ist.

  4. 4.

    Den WAL-Modus aktivieren

    Der Write-Ahead-Logging-Modus erlaubt Lesern und einem Schreiber, sich weit weniger in die Quere zu kommen. Für Anwendungen mit vielen gleichzeitigen Zugriffen deutlich entspannter:

    PRAGMA journal_mode=WAL;
    
  5. 5.

    Niemals über ein Netzlaufwerk betreiben

    Liegt die SQLite-Datei auf einer Netzfreigabe, funktioniert die Sperrmechanik unzuverlässig und „database is locked“ tritt sprunghaft auf. Die Datenbank gehört auf ein lokales Laufwerk — für den Netzwerkbetrieb ist eine Server-Datenbank die richtige Wahl.

Häufige Fragen (FAQ)

?Warum ist die Datenbank gesperrt, obwohl nur ein Programm läuft?

Weil eine frühere Verbindung nicht sauber geschlossen wurde und die Sperre noch hält – etwa nach einem Fehler, der den Code vorzeitig verlassen hat. SQLite erlaubt viele Leser, aber nur einen Schreiber. Eine einzige vergessene Transaktion blockiert damit alle folgenden Schreibzugriffe.

?Kann ich SQLite auf einem Netzlaufwerk betreiben?

Nein, und das ist keine Empfehlung, sondern eine Warnung. SQLite verlässt sich auf Dateisperren, die über SMB oder NFS unzuverlässig funktionieren. Das Ergebnis sind nicht nur Sperrfehler, sondern beschädigte Datenbanken. Eine SQLite-Datei gehört auf lokalen Speicher.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWLästigAccess denied for user

MySQL: Access denied for user

Der Login wird abgewiesen, obwohl das Passwort stimmt? Bei MySQL zählt auch, von welchem Host aus man kommt — der Benutzer ist an eine Herkunft gebunden.