Middle
Was sind Sperren im Kontext der Arbeit mit Datenbanken und warum sind sie notwendig?
sobes.tech KI
Antwort von AI
Datenbank-Sperren sind Mechanismen, die verwendet werden, um den gleichzeitigen Zugriff mehrerer Benutzer oder Prozesse auf dieselben Daten zu steuern. Sie verhindern Konflikte und erhalten die Datenintegrität in konkurrierenden Umgebungen.
Sie sind notwendig, um folgende Probleme zu lösen:
- Race Conditions: Situation, in der die Reihenfolge der Operationen das Endergebnis beeinflusst. Sperren stellen sicher, dass die Operationen sequenziell oder in einer datensicheren Reihenfolge ausgeführt werden.
- Inkonistente Lesevorgänge: Ein Prozess liest Daten, während ein anderer sie ändert, was zu einem Zwischen- oder unvollständigen Datenzustand führen kann. Sperren können dies verhindern.
- Verlorene Aktualisierungen: Zwei Prozesse lesen dieselben Daten, ändern sie und speichern sie dann. Die letzte Speicherung überschreibt die Änderungen des ersten, wodurch diese verloren gehen. Sperren helfen, den Verlust von Änderungen zu vermeiden.
- Phantom-Lesevorgänge: Innerhalb einer Transaktion liefert eine wiederholte Abfrage eine andere Menge an Zeilen zurück, weil ein anderer Prozess Zeilen hinzugefügt oder gelöscht hat, die den Abfragebedingungen entsprechen.
Haupttypen von Sperren:
- Geteilt (Shared/Read Lock): Ermöglicht mehreren Transaktionen, dieselben Daten gleichzeitig zu lesen. Schreibsperren auf diese Daten sind nicht erlaubt.
- Exklusiv (Exclusive/Write Lock): Gewährt exklusiven Zugriff auf die Daten. Nur eine Transaktion kann gleichzeitig eine exklusive Sperre auf bestimmte Daten haben. Lese- und Schreibsperren auf diese Daten sind nicht erlaubt.
Sperren können auf verschiedenen Ebenen angewendet werden:
- Datenbankebene: Die gesamte Datenbank wird gesperrt. Wird selten verwendet.
- Tabelleneebene: Die gesamte Tabelle wird gesperrt. Weniger granular, kann die Parallelität verringern.
- Zeilenebene: Eine einzelne Zeile wird gesperrt. Feiner granuliert, unterstützt hohe Parallelität, kann aber mehr Ressourcen erfordern.
- Seitenebene: Eine Datenseite (Speichereinheit in einem SGBD, die mehrere Zeilen enthält) wird gesperrt. Ein Kompromiss zwischen Sperren der gesamten Tabelle und einzelner Zeile.
Die Implementierung der Sperren hängt vom jeweiligen SGBD ab (z.B. InnoDB und MyISAM in MySQL haben unterschiedliche Strategien, PostgreSQL usw.). In PHP werden Transaktionen häufig zur Verwaltung der Sperren verwendet.
-- Beispiel für die Verwendung einer Transaktion und Sperre in SQL
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE legt eine exklusive Sperre auf die ausgewählte Zeile
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
COMMIT;
-- Oder ROLLBACK bei Fehler