www.wikidata.de-de.nina.az
Verlorenes Update auch englisch lost update bezeichnet in der Informatik einen Fehler der bei mehreren parallelen Schreibzugriffen auf eine gemeinsam genutzte Information auftreten kann Wenn zwei Transaktionen dieselbe Information verandern dann konnen die Anderungen der ersten sofort durch die Anderungen der zweiten uberschrieben werden Dabei spielt es keine Rolle ob die gemeinsam genutzte Information in einer Datei in einer Datenbanktabelle oder im Arbeitsspeicher steht Inhaltsverzeichnis 1 Lesen und Schreiben ohne Interaktion mit einem Benutzer 1 1 Beispiel 1 2 Methoden zur Umgehung des Problems 1 3 Der Isolationlevel RR 1 4 Verarbeitung serialisieren 1 5 Lese und Schreibzugriff atomisieren 2 Lesen und Schreiben mit Benutzerinteraktion 3 Siehe auchLesen und Schreiben ohne Interaktion mit einem Benutzer BearbeitenBeispiel Bearbeiten Eine Kette von Vorverkaufsstellen speichert fur jede Veranstaltung die Anzahl der verkauften Karten Es wurden bereits 100 Karten verkauft als an einer Kasse funf Karten zuruckgegeben werden Zur gleichen Zeit werden an einer zweiten Kasse drei Karten gekauft Das System der ersten Kasse zieht die 5 zuruckgegebenen Karten von den 100 ab und schreibt den neuen Wert 95 wieder in die Datenbank Das zweite Kassensystem addiert die drei soeben verkauften Karten zu der 100 dazu und schreibt diesen Wert 103 ebenfalls in die Datenbank Der zuerst geschriebene Wert geht dabei verloren das Endergebnis ist falsch 103 verkaufte Karten obwohl es tatsachlich nur 98 sind Zeitpunkt Programm 1 5 Karten zurucknehmen Gespeicherte Anzahl verkaufter Karten Programm 2 3 Karten verkaufen0 1001 Anzahl der verkauften Karten lesen Ergebnis 100 1002 100 Anzahl der verkauften Karten lesen Ergebnis 1003 5 Karten werden zuruckgenommen Neuen Wert berechnen 100 5 95Neuen Wert 95 schreiben 954 103 3 Karten werden verkauft Neuen Wert berechnen 100 3 103Neuen Wert 103 schreibenMethoden zur Umgehung des Problems Bearbeiten Bei der Ausfuhrung des Lesezugriffs wird die gemeinsam genutzte Information gesperrt damit eine zwischenzeitliche Anderung durch ein anderes Programm nicht moglich ist Die dafur benotigten Sperrmechanismen werden von den verschiedenen Datenverwaltungssystemen bereitgestellt der Share Lock ermoglicht beliebig vielen Transaktionen einen Lesezugriff der Exclusive Lock ermoglicht nur einer einzigen Transaktion einen schreibenden Zugriff In dieser Zeit darf keine andere Transaktion die gesperrten Daten lesen Diese Sperrmechanismen werden sowohl von den meisten Betriebssystemen und Datenbanken als auch von Buffer Managern verwendet um konkurrierende Zugriffe zu handhaben Der Isolationlevel RR Bearbeiten Oft wird der Isolationslevel RR Repeatable Read als Losung des Lost Update Problems genannt Die meisten RDBMS bieten verschiedene Isolationlevel an Repeatable Read bedeutet dass ein Share Lock bis zum Ende einer Transaktion bestehen bleibt und nicht direkt nach dem Lesezugriff wieder verschwindet Wenn man den Isolationlevel RR verwendet so muss man darauf achten dass keine Deadlocks entstehen Das erste Programm schreibt einen Share Lock der nicht wieder entfernt wird Das zweite Programm schreibt auch einen Share Lock Nun will das erste Programm den Share Lock in einen Exclusive Lock umwandeln doch das geht nicht solange das zweite Programm noch seinen Share Lock aufrechterhalt Etwas spater will das zweite Programm ebenfalls seinen Share Lock in einen Exclusive Lock umwandeln Nun wartet jeder auf den anderen Das ist die klassische Deadlock Situation Zeitpunkt Programm 1 5 Karten zurucknehmen Locks von Prog 1 Gespeicherte Anzahl verkaufter Karten Locks von Prog 2 Programm 2 3 neue Karten verkaufen0 1001 Anzahl der verkauften Karten lesen Ergebnis 100 S Lock von P1 1002 S Lock von P1 100 S Lock von P2 Anzahl der verkauften Karten lesen Ergebnis 1003 5 Karten werden zuruckgenommen Neuen Wert berechnen 100 5 95Exclusive Lock anfordernwarten auf P2 S Lock von P1 100 S Lock von P24 warten auf P2 S Lock von P1 100 S Lock von P2 3 Karten werden verkauft Neuen Wert berechnen 100 3 103Exclusive Lock anfordernwarten auf P15 warten auf P2 S Lock von P1 100 S Lock von P2 warten auf P1Nun kommt es darauf an wie das RDBMS in so einem Fall reagiert Einige RDBMS z B DB2 kann man so parametrisieren dass eine Transaktion nur eine bestimmte Zeit auf gesperrte Ressourcen wartet Sobald diese Zeit verstrichen und die Ressource immer noch gesperrt ist wird die Transaktion zuruckgerollt und das Programm erhalt eine Fehlermeldung SQLCODE 911 Das ware eine Losung fur das Problem denn durch den Rollback der ersten Transaktion ist auch der Share Lock entfernt worden und die zweite Transaktion bekommt nun den Exclusive Lock auf den sie gewartet hat Wenn im Programm der SQLCODE 911 gezielt abgefragt wird dann kann das Programm in einem solchen Fall den Satz erneut lesen und erhalt nun den Wert den das andere Programm gerade geschrieben hat So geht kein Update verloren Zeitpunkt Programm 1 5 Karten zurucknehmen Locks von Prog 1 Gespeicherte Anzahl verkaufter Karten Locks von Prog 2 Programm 2 3 neue Karten verkaufen6 SQLCODE 911 Rollback 100 S Lock von P2 warten auf P17 103 X Lock von P2 Neuen Wert 103 schreiben8 Anzahl der verkauften Karten lesen Share Lock anfordernwarten auf P2 103 X Lock von P29 Share Lock anfordern warten auf P2 103 commit10 Share Lock erhalten Anzahl der verkauften Karten lesenErgebnis 103 S Lock von P1 10311 5 Karten werden zuruckgenommen Neuen Wert berechnen 103 5 98X Lock anfordernNeuen Wert 98 schreiben X Lock von P1 9812 Commit 98Der zweite Versuch kann genauso wie der erste Versuch misslingen falls inzwischen ein drittes Programm einen Share Lock auf den Satz gelegt hat Daher muss das Lesen und Schreiben im Programm in einer Schleife ausgefuhrt werden Nun kann man sich uberlegen ob die Schleife beliebig oft wiederholt werden soll oder ob nach n Versuchen die Verarbeitung dann doch aufgegeben und mit einer Fehlermeldung beendet werden soll Schleife Select Neuen Wert berechnen Update if sqlcode not in 0 911 return FEHLER Until sqlcode 0 or Anz Schleifen Durchlaeufe gt n if sqlcode lt gt 0 return FEHLER Falls das RDBMS im Fall eines Deadlock so lange wartet bis ein Administrator eingreift dann ist diese Variante keine gute Losung Verarbeitung serialisieren Bearbeiten Wenn das erste Programm die Information schon gleich beim Lese Zugriff exklusiv sperrt dann muss das zweite Programm schon mit seinem Lesezugriff warten Sobald das erste Programm auch den Schreibzugriff ausgefuhrt hat und die Ressource wieder freigibt kann das zweite Programm seine Verarbeitung fortsetzen Diese Variante ist eine erzwungene Serialisierung der Verarbeitung Wenn die Information in einer Datei gespeichert wird muss das Programm die Datei gleich zum Schreiben offnen Wenn die Information in einer Datenbank Tabelle gespeichert wird dann kann der Satz z B durch einen CURSOR FOR UPDATE gelesen werden oder die gesamte Tabelle kann durch LOCK TABLE IN EXCLUSIVE MODE gesperrt werden Lese und Schreibzugriff atomisieren Bearbeiten Wenn zwischen dem Lesezugriff und dem Schreibzugriff keine weitere Verarbeitung erforderlich ist kann man diese beiden Zugriffe auch zusammenfassen Siehe Atomare Operation Bei einem RDBMS konnte der Zugriff fur das Beispiel lauten update Tab set Anzahl verkaufte Karten Anzahl verkaufte Karten Aktueller Verkauf Dadurch entfallt ein gesonderter Lese Zugriff Ein verlorenes Update kann nicht mehr vorkommen Lesen und Schreiben mit Benutzerinteraktion BearbeitenIn der Praxis kommt das Problem des verlorenen Updates auch haufig in Verbindung mit Benutzerinteraktionen vor Damit ist gemeint dass die gelesenen Informationen an den Benutzer ausgegeben werden und von ihm verandert werden konnen Danach werden die geanderten Informationen zuruckgeschrieben Wenn ein anderer Benutzer dieselben Informationen andern will dann kann es sein dass die Anderungen des ersten Benutzers verloren gehen Folgendes ist bei Benutzerinteraktion anders als im Fall ohne Lesen und Schreiben konnen nicht verschmolzen werden Lesen und Schreiben werden in den meisten Fallen als zwei unabhangige Transaktionen ausgefuhrt Es muss berucksichtigt werden dass sich der Benutzer moglicherweise viel Zeit lasst mit der Eingabe z B Mittagspause was bedeutet dass viel Zeit zwischen Lesen und Schreiben vergehen kann Wahrend der Benutzerinteraktion kann die Verbindung abbrechen Netzwerk Problem das Programm wird beendet Verhindern kann man das indem man vor dem Schreiben uberpruft ob die Daten inzwischen geandert wurden und diesen Lese und Schreibzugriff in einer einzigen Transaktion zusammenfasst Dabei muss nicht jeder einzelne Spaltenwert des Datensatzes gepruft werden Es genugt zu wissen ob der Datensatz geandert wurde Das kann durch eine zusatzliche Spalte mit einer Ganzzahl erreicht werden Hierdurch wird prufbar ob beim Schreibzugriff noch der Wert des Lesezugriffs vor der Datenanderung steht Ist dem so muss die nun abschliessende Lese Schreib Transaktion den Wert in dieser Spalte entsprechend um 1 erhohen Gleichzeitig werden auch die anderen Spaltenwerte aktualisiert Man muss sich also nur eine einzige Ganzzahl gelesener spaltentestwert merken In SQL sieht das etwa so aus Der Datensatz wird gelesen um anschliessend bearbeitet werden zu konnen gelesener spaltentestwert muss in einer Variable abgespeichert werden SELECT tabelle spalte 1 gelesener spaltentestwert WHERE id tabelle Der Datensatz wird verandert und anschliessend zuruckgeschrieben Die Uberprufung auf Anderung durch konkurrierende Zugriffe und der Schreibvorgang werden zusammengefasst UPDATE tabelle SET spalte 1 spaltenwert 1 gelesener spaltentestwert gelesener spaltentestwert 1 WHERE spaltentestwert gelesener spaltentestwert AND id tabelle Wird hierbei kein Datensatz gefunden stimmt gelesener spaltentestwert nicht mehr und es hat zwischenzeitlich ein Update durch einen anderen Zugriff stattgefunden Es muss also jetzt eine Fehlerauswertung erfolgen und entsprechend reagiert werden Im Erfolgsfall ist die Bearbeitung des Datensatzes jetzt beendet Die Spaltenwerte sind dann naturlich entsprechend der verwendeten Programmiersprache als Variablen anzugeben Siehe auch BearbeitenIsolation Datenbank ACID Phantomproblem Schreib Lese Konflikt Nichtwiederholbares Lesen Abgerufen von https de wikipedia org w index php title Verlorenes Update amp oldid 229068158