Locks im DBMS
Datenbankmanagementsysteme erlauben es einem Nutzer, Daten zu lesen und zu verändern. In der heutigen Welt können aber Tausende Menschen gleichzeitig Änderungen an einer Datenbank vornehmen. Wenn die Nutzer überwiegend Daten lesen, ist diese Last für den Datenbankserver kein großes Problem. Schreiben oder ändern dagegen mehrere Nutzer Daten gleichzeitig, muss der Server deutlich komplexere Aufgaben lösen.
Stell dir vor, du erstellst einen Finanzbericht, der die täglichen Verkäufe eines Ladens für eine Woche zusammenfasst. Während du am Bericht arbeitest, passieren gleichzeitig folgende Aktionen:
- Ein Kunde kauft einen Artikel.
- Ein anderer Kunde gibt einen defekten Artikel zurück und bekommt sein Geld erstattet.
- Der Laden erhält eine neue Lieferung.
Während du also den Bericht zusammenstellst, ändern mehrere Nutzer die Daten in der Datenbank. Welche Zahlen sollen am Ende im Bericht stehen?
Die Antwort hängt davon ab, wie dein Server mit Locks umgeht.
Lock
Ein Lock ist ein Mechanismus, der den Zugriff auf Daten einschränkt, um eine korrekte Verarbeitung von Transaktionen sicherzustellen.
Datenbankserver setzen Locks ein, um den gleichzeitigen Zugriff auf Daten zu steuern: Solange eine Transaktion mit Daten arbeitet, können andere Transaktionen diese nicht verändern.
Wenn Daten in der Datenbank gesperrt sind, müssen andere Nutzer, die dieselben Daten lesen oder ändern wollen, warten, bis der Lock wieder aufgehoben ist.
Granularität von Locks
Es gibt mehrere Strategien, wie genau eine Ressource gesperrt werden kann. Der Server kann auf einer von drei Ebenen – Granularitäten – sperren.
- Tabellen-Locks
Verhindern, dass mehrere Nutzer gleichzeitig Daten in derselben Tabelle ändern. - Page-Locks
Verhindern, dass mehrere Nutzer gleichzeitig Daten auf derselben Page einer Tabelle ändern (eine Page ist ein Speichersegment, in der Regel zwischen 2 und 16 KByte groß). - Row-Locks
Verhindern, dass mehrere Nutzer gleichzeitig dieselbe Zeile in einer Tabelle ändern.
Diese Ansätze haben jeweils Vor- und Nachteile. Eine ganze Tabelle zu sperren ist schnell erledigt, kann aber bei vielen Nutzern zu langen Wartezeiten führen. Row-Locks erfordern mehr Verwaltungsaufwand, erlauben dafür aber mehreren Nutzern, gleichzeitig dieselbe Tabelle zu ändern, solange sie an unterschiedlichen Zeilen arbeiten.
MySQL kann je nach gewählter Storage Engine Tabellen-, Page- oder Row-Locks verwenden. Standardmäßig setzt MySQL die Storage Engine InnoDB ein, die Row-Locks unterstützt.
PostgreSQL nutzt Multiversion Concurrency Control (MVCC) und arbeitet standardmäßig mit Row-Locks.
Bevor wir im nächsten Artikel zum Thema Transaktionen weitergehen, prüfen wir kurz, wie du diese Lektion verstanden hast.
Wofür werden Locks im DBMS gebraucht?