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?

  1. A2
  2. B5
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Datenbanken

  1. Welche Aussage beschreibt unter den Problemen, die bei gleichzeitig laufenden Transaktionen auftreten, einen Dirty Read richtig?
  2. Transaktion T1 führte SELECT COUNT(*) FROM Bestellung WHERE Betrag >= 1000 aus und erhielt 8. Unmittelbar danach fügte T2 eine Bestellzeile mit einem Betrag von 2000 per INSERT ein und schrieb sie fest. Als T1 dieselbe SELECT-Anweisung erneut ausführte, erhielt sie 9. Um welches Phänomen handelt es sich?
  3. Welche Antwort nennt richtig die Phänomene, die unter dem im SQL-Standard definierten Isolationslevel READ COMMITTED auftreten können?
  4. Transaktion T1 hält eine gemeinsame Sperre (Shared Lock) auf einer Zeile und liest sie. T2 fordert eine gemeinsame Sperre und T3 eine exklusive Sperre (Exclusive Lock) auf dieselbe Zeile an. Was gilt für den Zeitraum, bis T1 ihre Sperre freigibt?
  5. Welche Aussage beschreibt das für die Nebenläufigkeitskontrolle von Transaktionen verwendete Zwei-Phasen-Sperrprotokoll (2PL) richtig?