Bei der Abarbeitung konkurrierender Transaktionen kann es zu inkonsistenten Situationen kommen. Sie sollten versuchen, Sperrverhalten und Isolation-Level des Datenbanksystems so festzulegen, dass diese Situationen verhindert werden.
Folgende Phänomene können bei konkurrierenden Zugriffen auf den gleichen Datenbestand auftreten:
· Dirty-Read
In einer Transaktion T1 wird eine Zeile geändert und eine Transaktion T2 liest diese Zeile, bevor T1 durch die COMMIT-Anweisung abgeschlossen ist. T1 führt dann die ROLLBACK-Anweisung aus. T2 hat in diesem Fall eine Zeile gelesen, die eigentlich nie existierte.
· Non-Repeatable-Read
Eine Transaktion T1 liest eine Zeile. Eine Transaktion T2 verändert oder löscht dann diese Zeile und schließt mit der COMMIT-Anweisung ab. Wenn T1 anschließend die Zeile nochmals liest, erhält T1 entweder die veränderte Zeile oder die Meldung, dass die Zeile nicht mehr existiert.
· Phantom
Eine Transaktion T1 führt eine SQL-Anweisung S aus, die eine Menge M von Zeilen liest, die eine Suchbedingung erfüllen. Eine Transaktion T2 erzeugt dann z. B. durch das Einfügen oder Ändern von Daten mindestens eine weitere Zeile, die die Suchbedingung erfüllt. Wenn in T1 anschließend nochmals S ausgeführt wird, unterscheidet sich die Menge der gelesenen Zeilen von M.
Die Tabelle gibt eine Übersicht darüber, welche Phänomene in welchem Isolation-Level auftreten können.
|
Isolation Level |
|||
0 |
1 oder 10 |
2 oder 20 |
3 oder 30 |
|
Dirty-Read |
ja |
nein |
nein |
nein |
Non-Repeatable-Read |
ja |
ja |
nein |
nein |
Phantom |
ja |
ja |
ja |
nein |