Databases Reference
In-Depth Information
update konten set saldo=saldo+100 where id=42;
In Abhängigkeit vom Erfolg der SQL-Anweisungen erhalten wir eines der folgen-
den Ergebnisse:
Mit dem erfolgreichen Abschluss beider Anweisungen ist auch die Überwei-
sung ausgeführt.
Wenn beide Anweisungen fehlschlagen, hat keine Überweisung stattgefunden,
aber der Datenbestand ist nach wie vor in einem konsistenten Zustand.
Anders sieht es aus, wenn genau eine der beiden Anweisungen fehlschlägt:
Wenn beispielsweise der Kontostand von Konto 23 kleiner als
100 ist, wird
die update -Anweisung aufgrund der Integritätsregel in der Tabellendefiniti-
on von konten zurückgewiesen. Wird die zweite Anweisung dennoch ausge-
führt, befinden sich auf Konto 42 - ohne Gegenbuchung - plötzlich 100
 
mehr.
Der Datenbestand ist inkonsistent, und genau das ist es ja, was wir unbedingt
vermeiden wollen.
 
In diesem sehr einfachen Szenario gibt es eine Lösung: Wenn die erste Anweisung
nicht erfolgreich ist, führen wir die zweite erst gar nicht aus. Wenn wir sie doch
ausgeführt haben, machen wir sie einfach wieder mit
update konten set saldo=saldo-100 where id=42;
rückgängig. Wir können diese Reparaturmaßnahme durchführen und überwa-
chen, weil wir die Anweisungen an der H2-Konsole ausführen und so den Über-
blick behalten können. In einem realitätsnahem Szenario werden aber Hunderte
von Überweisungen pro Sekunde ausgeführt - und da fällt es uns nicht mehr so
leicht, aufzupassen.
Im folgenden Beispiel sehen wir, dass es noch nicht einmal mehrerer SQL-
Anweisungen bedarf, um mit dem geschilderten Problem konfrontiert zu werden:
Von einer einzigen update -Anweisung können viele Datensätze betroffen sein.
Wenn wir etwa allen unseren Kunden am Ende eines Kalenderjahres 5% Zinsen
gutschreiben wollen, reicht dazu eine Anweisung:
update konten set saldo=saldo * 1.05
Wenn die Bearbeitung der Anweisung - aus welchen Gründen auch immer -
unterbrochen wird, wissen wir nicht, welche Konten bereits bearbeitet wurden.
Wenn wir die Anweisung also mit
update konten set saldo=saldo/1.05
rückgängig machen, erwischen wir möglicherweise auch Konten, auf denen noch
gar keine Zinszahlung verbucht wurde. Wir haben es mit einer Inkonsistenz zu tun,
die wir nicht so einfach in den Griff bekommen.
 
Search WWH ::




Custom Search