Eine Historie, auch genannt Schedule, für eine Menge von Transaktionen ist
eine Festlegung für die Reihenfolge sämtlicher relevanter
Datenbankoperationen. Ein Schedule heißt seriell, wenn alle Schritte einer
Transaktion unmittelbar hintereinander ablaufen. Wir unterscheiden nur noch
zwischen read- und write-Operationen.
Zum Beispiel transferiere T1 einen bestimmten Betrag von A nach B und T2 transferiere einen Betrag von C nach A. Eine mögliche Historie zeigt Tabelle 13.4.
Schritt | T1 | T2 |
1. | BOT | |
2. | read(A) | |
3. | BOT | |
4. | read(C) | |
5. | write(A) | |
6. | write(C) | |
7. | read(B) | |
8. | write(B) | |
9. | commit | |
10. | read(A) | |
11. | write(A) | |
12. | commit |
Schritt | T1 | T2 |
1. | BOT | |
2. | read(A) | |
3. | write(A) | |
4. | read(B) | |
5. | write(B) | |
6. | commit | |
7. | BOT | |
8. | read(C) | |
9. | write(C) | |
10. | read(A) | |
11. | write(A) | |
12. | commit |
Tabelle 13.6 zeigt ein Schedule der Transaktionen T1 und T3, welches nicht serialisierbar ist.
Schritt | T1 | T3 |
1. | BOT | |
2. | read(A) | |
3. | write(A) | |
4. | BOT | |
5. | read(A) | |
6. | write(A) | |
7. | read(B) | |
8. | write(B) | |
9. | commit | |
10. | read(B) | |
11. | write(B) | |
12. | commit |
Im Einzelfall kann die konkrete Anwendungssemantik zu einem äquivalenten seriellen Schedule führen, wie Tabelle 13.7 zeigt.
Schritt | T1 | T3 |
1. | BOT | |
2. | read(A, a1) | |
3. | a1 : = a1 - 50 | |
4. | write(A, a1) | |
5. | BOT | |
6. | read(A, a2) | |
7. | a2 : = a2 - 100 | |
8. | write(A, a2) | |
9. | read(B, b2) | |
10. | b2 : = b2 + 100 | |
11. | write(B, b2) | |
12. | commit | |
13. | read(B, b1) | |
14. | b1 : = b1 + 50 | |
15. | write(B, b1) | |
16. | commit |
Unter einer anderen Semantik würde T1 einen Betrag von 50,- DM von A nach B überweisen und Transaktion T2 würde beiden Konten jeweils 3 % Zinsen gutschreiben. Tabelle 13.8 zeigt den Ablauf.
Schritt | T1 | T3 |
1. | BOT | |
2. | read(A, a1) | |
3. | a1 : = a1 - 50 | |
4. | write(A, a1) | |
5. | BOT | |
6. | read(A, a2) | |
7. | a2 : = a2*1.03 | |
8. | write(A, a2) | |
9. | read(B, b2) | |
10. | b2 : = b2*1.03 | |
11. | write(B, b2) | |
12. | commit | |
13. | read(B, b1) | |
14. | b1 : = b1 + 50 | |
15. | write(B, b1) | |
16. | commit |