Nichtwiederholbares Lesen

aus Wikipedia, der freien Enzyklopädie

Nichtwiederholbares Lesen oder Non-Repeatable Read bezeichnet in der Informatik ein Problem, das auftritt, wenn innerhalb einer Transaktion die gleiche Leseoperation nacheinander unterschiedliche Ergebnisse liefert.

Beispiel

Diese Transaktion könnte bei einem Wiki dazu eingesetzt werden, eine einfache Benutzerstatistik zu erstellen:

Transaktionsanfang
Selektiere alle Benutzernamen mit weniger als fünf eingestellten Artikeln (Aktion 1a)
Gib die Liste der faulen Benutzer aus
Selektiere alle Benutzerdatensätze mit weniger als fünf eingestellten Artikeln (Aktion 1b)
Gib für diese Benutzer eine genauere Aufschlüsselung aus (Alter des Kontos, genaue Anzahl der Artikel usw.)
Transaktionsende

Gleichzeitig könnte die folgende Transaktion Bestandteil der bei Einstellen eines neuen Artikels ablaufenden Operationen sein:

Transaktionsanfang
Füge neuen Artikel ein (Aktion 2a)
Erhöhe Anzahl der eingestellten Artikel des einstellenden Benutzers (Aktion 2b)
Transaktionsende

Wenn ein Benutzer sich nun die Statistik anzeigen lässt, während ein anderer Benutzer gleichzeitig seinen fünften neuen Artikel einstellt, kann es zu dem folgenden Ablauf kommen. Hierbei würde der einstellende Benutzer lediglich in der Liste der faulen Benutzer angezeigt, bei der genaueren Aufschlüsselung (Ergebnis von Aktion 1b) würde er aber fehlen:

Zeitpunkt Transaktion 1 Transaktion 2 Wirkung
1 Aktion 1a Aktion 2a Benutzer wird angezeigt: Der Artikelzähler steht nur auf 4
2 Aktion 2b Artikelzähler wird auf 5 erhöht
3 Aktion 1b Benutzer ist nicht enthalten: Er hat nicht mehr weniger als 5 Artikel eingestellt

Je nach Umsetzung in der Software ist dies eine ernstzunehmende Fehlerquelle, da sich die Software beispielsweise darauf verlassen könnte, für alle zu Beginn gelesenen Benutzer weitere Informationen zu erhalten und nicht mit fehlenden Daten für einen Benutzer umgehen könnte.

Abhilfe

Datenbanken bieten üblicherweise die Möglichkeit der Transaktionsisolation. Bei Isolation durch Serialisierung könnte der obige Ablauf beispielsweise wie folgt aussehen; die Leseoperation wird wiederholbar:

Zeitpunkt Transaktion 1 Transaktion 2 Wirkung
1 Aktion 1a Aktion 2a Benutzer wird angezeigt: Der Artikelzähler steht nur auf 4
2 [Aktion 2b] Benutzertabelle gesperrt: Transaktion muss warten
3 Aktion 1b Benutzer wird ausgegeben, da Zähler noch nicht erhöht
4 Aktion 2b Transaktion wird fortgeführt, Zähler wird erhöht

Siehe auch