Grundlagen der Datenbanken
Der Bestand eines Produkts in einer Lagertabelle ist 10. Transaktion T1 liest den Bestand und schreibt den Wert minus 3 zurück, T2 liest den Bestand und schreibt den Wert minus 5 zurück. Wie hoch ist der Endbestand, wenn beide ohne Sperren in der Reihenfolge T1 liest, T2 liest, T1 schreibt, T2 schreibt ablaufen?
- A2
- B5
- C7
Antwort und Erläuterung anzeigen
Antwort: B. 5
T1 und T2 lesen beide den Bestand 10, bevor die jeweils andere geschrieben hat. T1 schreibt 10 − 3 = 7, doch T2 überschreibt dies anschließend mit 10 − 5 = 5, berechnet aus den von ihr gelesenen 10, sodass der Endbestand 5 ist. Richtig wäre 10 − 3 − 5 = 2 gewesen, das Ergebnis der beiden Vorgänge nacheinander; die Änderung von T1 ist verloren gegangen. Das nennt man Lost Update (verlorene Änderung). Verhindern lässt es sich, indem man beim Lesen eine exklusive Sperre setzt, sodass das Lesen von T2 wartet, bis T1 fertig ist (etwa mit SELECT … FOR UPDATE), oder indem man Lesen und Schreiben in einer einzigen SQL-Anweisung ausführt, etwa UPDATE Lager SET Bestand = Bestand - 3.