Schreib-Lese-Konflikt

Ein Schreib-Lese-Konflikt (auch englisch dirty read) tritt in der Informatik auf, wenn von zwei gleichzeitig ablaufenden Transaktionen die eine Transaktion Daten liest, die von der anderen Transaktion geschrieben bzw. geändert werden, jedoch noch nicht bestätigt (committed) sind.

Beispiel

Die folgende Transaktion könnte bei der Benutzeranmeldung in einem Wiki auftreten:

Transaktionsanfang
Füge neuen Benutzerdatensatz ein (Aktion 1a)
Selektiere alle gesperrten Benutzer mit derselben IP-Adresse (Aktion 1b)
Wenn diese IP-Adresse gebannt ist,
Rollback und Ausgabe einer Fehlermeldung
sonst
Commit und Ausgabe einer Erfolgsmeldung
Transaktionsende

Gleichzeitig könnte eine Funktion, mit der sich ein Benutzer eine Liste der angemeldeten Benutzer anzeigen lassen kann, die folgende Transaktion ausführen:

Transaktionsanfang
Selektiere alle Benutzerdatensätze (Aktion 2a)
Gib die gefundenen Benutzerdaten als bunte Webseite aus
Transaktionsende

Ohne Transaktionsisolation kann es nun auf die folgende Weise zu einem Schreib-Lese-Konflikt kommen, der dazu führt, dass auch ein eigentlich noch nicht existierender Datensatz ausgegeben wird:

ZeitpunktTransaktion 1Transaktion 2Wirkung
1Aktion 1aBenutzerdatensatz wird vorübergehend angelegt
2Aktion 1bSperrliste wird gelesen; Benutzer ist gesperrt
3Aktion 2aVorläufiger Benutzerdatensatz wird mit ausgegeben
4RollbackVorläufig angelegter Datensatz wird wieder entfernt

Abhilfe

Datenbanken bieten üblicherweise die Möglichkeit der Transaktionsisolation. Bei Isolation durch Serialisierung könnte der obige Ablauf beispielsweise wie folgt aussehen; der Schreib-Lese-Konflikt wird vermieden:

ZeitpunktTransaktion 1Transaktion 2Wirkung
1Aktion 1aBenutzerdatensatz wird vorübergehend angelegt
2Aktion 1bSperrliste wird gelesen; Benutzer ist gesperrt
3Aktion 2aTabelle gesperrt: Transaktion muss warten
4RollbackVorläufig angelegter Datensatz wird wieder entfernt
5Aktion 2aTransaktion wird fortgeführt, vorläufiger Eintrag wird nicht mit ausgegeben

Siehe auch