KI-generiertes Bild
21 Oktober 2026

Was sind Locks in PostgreSQL und wie funktionieren sie?

Wer mit PostgreSQL® arbeitet, stößt früher oder später auf das Thema Locks. Sperrmechanismen gehören zu den grundlegenden Konzepten jeder relationalen Datenbank und sind entscheidend dafür, dass mehrere Prozesse gleichzeitig sicher auf dieselben Daten zugreifen können. Gleichzeitig sind sie eine häufige Ursache für Performance-Probleme, wenn sie nicht richtig verstanden werden.

Dieser Artikel führt Sie Schritt für Schritt durch das Locking-System von PostgreSQL®: von der grundlegenden Definition über die verschiedenen Lock-Modi bis hin zu praktischen Strategien, mit denen Sie Lock-Konflikte in Ihrer Datenbankumgebung gezielt vermeiden können.

Was sind Locks in PostgreSQL?

Ein Lock, auf Deutsch auch als Sperre oder Datenbank-Lock bezeichnet, ist ein Mechanismus, der den gleichzeitigen Zugriff mehrerer Transaktionen auf dieselben Daten kontrolliert. PostgreSQL® setzt Locks ein, um die Datenintegrität zu gewährleisten und sicherzustellen, dass keine zwei Operationen gleichzeitig in einer Weise auf dieselben Ressourcen zugreifen, die zu inkonsistenten Ergebnissen führen würde.

Stellen Sie sich eine Datenbanktabelle wie ein gemeinsam genutztes Dokument vor: Wenn zwei Personen gleichzeitig dieselbe Zeile bearbeiten, kann es zu widersprüchlichen Änderungen kommen. PostgreSQL®-Sperren verhindern genau das, indem sie Zugriffsrechte koordinieren, bevor eine Transaktion mit ihrer Arbeit beginnt.

Wichtig zu verstehen ist: Locks sind kein Fehler im System, sondern ein bewusst eingesetztes Werkzeug. Probleme entstehen erst dann, wenn Sperren zu lange gehalten werden oder wenn Transaktionen aufeinander warten und sich gegenseitig blockieren.

Wie funktioniert das Locking-System von PostgreSQL?

PostgreSQL® verwaltet Locks auf mehreren Ebenen gleichzeitig. Das System unterscheidet grundsätzlich zwischen Table-Level Locks (Tabellensperren) und Row-Level Locks (Zeilensperren). Beide Ebenen arbeiten zusammen, um einen möglichst feingranularen und effizienten Zugriff zu ermöglichen.

Table-Level Locks

Tabellensperren betreffen die gesamte Tabelle und werden automatisch von Datenbankoperationen angefordert. Ein einfaches SELECT setzt beispielsweise einen schwachen Lock, der kaum andere Operationen blockiert. Ein ALTER TABLE hingegen benötigt einen exklusiven Lock, der alle anderen Zugriffe auf die Tabelle verhindert, bis die Operation abgeschlossen ist.

Row-Level Locks

Row-Level Locking ist feingranularer und betrifft nur einzelne Datensätze. Wenn eine Transaktion eine Zeile mit UPDATE oder DELETE verändert, setzt PostgreSQL® automatisch einen Zeilen-Lock. Andere Transaktionen können weiterhin andere Zeilen lesen und verändern, nur die gesperrte Zeile ist für konkurrierende Schreibzugriffe blockiert.

PostgreSQL® verwendet außerdem sogenannte Advisory Locks: anwendungsdefinierte Sperren, die Entwicklerinnen und Entwickler manuell setzen und freigeben können, um eigene Koordinationslogik auf Datenbankebene abzubilden.

Lock-Modi und ihre Kompatibilität in der Praxis

PostgreSQL® kennt acht verschiedene Table-Level-Lock-Modi, die jeweils unterschiedliche Kompatibilitäten miteinander haben. Das bedeutet: Manche Lock-Modi können gleichzeitig von verschiedenen Transaktionen gehalten werden, andere schließen sich gegenseitig aus.

Die wichtigsten Modi im Überblick:

  • ACCESS SHARE: Wird von SELECT-Abfragen gesetzt. Sehr schwach, kompatibel mit fast allen anderen Modi außer ACCESS EXCLUSIVE.
  • ROW SHARE: Wird von SELECT FOR UPDATE und SELECT FOR SHARE gesetzt.
  • ROW EXCLUSIVE: Wird von INSERT, UPDATE und DELETE gesetzt.
  • SHARE UPDATE EXCLUSIVE: Wird von VACUUM, ANALYZE und bestimmten CREATE INDEX CONCURRENTLY-Operationen verwendet.
  • SHARE: Wird von CREATE INDEX (ohne CONCURRENTLY) gesetzt.
  • EXCLUSIVE: Blockiert fast alle anderen Schreiboperationen, erlaubt aber noch lesende Zugriffe.
  • ACCESS EXCLUSIVE: Der stärkste Lock-Modus, gesetzt von ALTER TABLE, DROP TABLE und ähnlichen DDL-Operationen. Blockiert alle anderen Zugriffe vollständig.

In der Praxis bedeutet das: Ein laufendes ALTER TABLE wartet, bis alle anderen Transaktionen abgeschlossen sind, bevor es seinen ACCESS EXCLUSIVE Lock erhält. Gleichzeitig blockiert es alle neuen Anfragen, die danach eintreffen. Lange Transaktionen können dadurch eine Warteschlange auslösen, die sich schnell zu einem Performance-Problem entwickelt.

Deadlocks erkennen und verstehen

Aufbauend auf dem Verständnis der Lock-Modi lässt sich nun ein besonders kritisches Szenario erklären: der Deadlock. Ein Deadlock entsteht, wenn zwei oder mehr Transaktionen sich gegenseitig blockieren, weil jede auf einen Lock wartet, den die andere hält.

Ein klassisches Beispiel: Transaktion A sperrt Zeile 1 und wartet auf Zeile 2. Gleichzeitig sperrt Transaktion B Zeile 2 und wartet auf Zeile 1. Beide Transaktionen warten aufeinander, ohne dass eine von ihnen fortschreiten kann.

PostgreSQL® erkennt Deadlocks automatisch durch einen internen Erkennungsmechanismus, der in regelmäßigen Abständen prüft, ob Wartezyklen entstanden sind. Wird ein Deadlock erkannt, bricht PostgreSQL® eine der beteiligten Transaktionen ab und gibt eine entsprechende Fehlermeldung aus:

ERROR: deadlock detected

Diese Fehlermeldung erscheint im PostgreSQL®-Log und enthält Informationen darüber, welche Prozesse beteiligt waren und welche Locks im Konflikt standen. Das ist der erste Anhaltspunkt für die Diagnose.

Typische Lock-Probleme diagnostizieren

Um Lock-Konflikte in einer laufenden PostgreSQL®-Umgebung zu analysieren, stellt das System mehrere nützliche System-Views bereit. Die wichtigsten sind pg_locks und pg_stat_activity.

Mit einer Kombination beider Views lässt sich gezielt abfragen, welche Prozesse gerade auf einen Lock warten und welche Transaktion den gesuchten Lock hält. Eine typische Diagnoseabfrage sieht so aus:

Verbinden Sie pg_locks über die pid mit pg_stat_activity, um die wartenden und blockierenden Prozesse samt ihrer aktuellen SQL-Abfrage zu sehen. So identifizieren Sie schnell, welche Transaktion eine Warteschlange verursacht.

Weitere hilfreiche Indikatoren für Lock-Probleme sind:

  • Lange Transaktionsdauern in pg_stat_activity (Spalte xact_start)
  • Viele Einträge mit dem Status waiting in pg_stat_activity
  • Häufige Deadlock-Einträge im PostgreSQL®-Log
  • Anstieg der Antwortzeiten bei gleichzeitig niedriger CPU-Last

Ein gutes Monitoring-Setup macht solche Muster sichtbar, bevor sie zu ernsthaften Ausfällen führen.

Lock-Konflikte gezielt vermeiden

Das Wissen über Lock-Modi und Deadlocks lässt sich direkt in konkrete Maßnahmen übersetzen. Die folgenden Strategien helfen dabei, Lock-Konflikte in PostgreSQL®-Umgebungen zu reduzieren:

  • Transaktionen kurz halten: Je kürzer eine Transaktion, desto kürzer hält sie ihre Locks. Vermeiden Sie es, Transaktionen unnötig offen zu lassen, etwa durch Benutzereingaben mitten in einer Transaktion.
  • Konsistente Zugriffsreihenfolge: Wenn mehrere Transaktionen dieselben Tabellen oder Zeilen in einer festen Reihenfolge ansprechen, entstehen keine Zyklen und damit keine Deadlocks.
  • DDL-Operationen in Wartungsfenstern: Operationen wie ALTER TABLE, die einen ACCESS EXCLUSIVE Lock benötigen, sollten nach Möglichkeit außerhalb der Hauptlastzeiten durchgeführt werden.
  • CREATE INDEX CONCURRENTLY verwenden: Statt eines regulären CREATE INDEX mit starkem Lock ermöglicht die CONCURRENTLY-Option das Erstellen von Indizes ohne exklusive Tabellensperre.
  • lock_timeout und statement_timeout setzen: Mit diesen PostgreSQL®-Parametern können Sie verhindern, dass Transaktionen unbegrenzt auf einen Lock warten und dabei andere Prozesse blockieren.
  • Explizite Locks sparsam einsetzen: SELECT FOR UPDATE und ähnliche Konstrukte sind mächtig, aber wenn sie unnötig oder zu breit eingesetzt werden, erzeugen sie mehr Konflikte als nötig.

Besonders in Systemen mit hoher Nebenläufigkeit lohnt es sich, PostgreSQL®-Locking-Verhalten regelmäßig zu analysieren und die Abfragelogik entsprechend anzupassen.

So unterstützt credativ® bei PostgreSQL®-Lock-Problemen

Lock-Konflikte und Deadlocks gehören zu den häufigsten Performance-Problemen in produktiven PostgreSQL®-Umgebungen. Sie sind oft schwer zu reproduzieren und erfordern tiefes Wissen über das interne Verhalten der Datenbank. Genau hier setzt das PostgreSQL® Kompetenz-Center von credativ® an.

Wir unterstützen Sie konkret bei:

  • Lock-Analyse und Diagnose: Wir untersuchen Ihre PostgreSQL®-Umgebung systematisch auf Lock-Konflikte, Deadlock-Muster und blockierende Transaktionen.
  • Performance-Tuning: Unsere Spezialisten optimieren Abfragelogik, Indexstrategien und Transaktionsdesign, um Sperrkonflikte strukturell zu reduzieren.
  • Maßgeschneidertes Monitoring: Wir richten Monitoring-Umgebungen ein, die Lock-Probleme frühzeitig sichtbar machen, bevor sie den Betrieb beeinträchtigen.
  • Schulungen und Workshops: In individuellen Workshops vermitteln wir Ihrem Team das notwendige Wissen, um PostgreSQL®-Locks sicher zu verstehen und zu handhaben.
  • Operativer Support rund um die Uhr: Unser 24/7 Open Source Support steht Ihnen bei akuten Lock-Problemen direkt zur Seite, ohne Callcenter und ohne Umwege.

Haben Sie Fragen zu Lock-Problemen in Ihrer PostgreSQL®-Umgebung oder möchten Sie Ihre Datenbankinfrastruktur auf ein stabiles Fundament stellen? Kontaktieren Sie uns und sprechen Sie direkt mit unseren PostgreSQL®-Spezialisten.

PostgreSQL® ist eine Marke der PostgreSQL Global Development Group. credativ® ist Competence Center für PostgreSQL®. Die Nennung dient ausschließlich der sachlichen Beschreibung von Dienstleistungen von credativ®. Es besteht keine geschäftliche Verbindung zu den genannten Markeninhabern.

Ähnliche Artikel

Kategorien: credativ® Inside

über den Autor

Peter Dreuw

Head of Sales & Marketing

zur Person

Peter Dreuw arbeitet seit 2016 für die credativ GmbH und ist seit 2017 Teamleiter. Seit 2021 ist er Teil des Management-Teams als VP Services der Instaclustr. Mit der Übernahme durch die NetApp wurde seine neue Rolle "Senior Manager Open Source Professional Services". Im Rahmen der Ausgründung wurde er Mitglied der Geschäftsleitung als Prokurist. Sein Aufgabenfeld ist die Leitung des Vertriebs und des Marketings. Er ist Linux-Nutzer der ersten Stunden und betreibt Linux-Systeme seit Kernel 0.97. Trotz umfangreicher Erfahrung im operativen Bereich ist er leidenschaftlicher Softwareentwickler und kennt sich auch mit hardwarenahen Systemen gut aus.

Beiträge ansehen


Beitrag teilen: