Erstellen Sie einen nicht wiederholbaren Lesevorgang, bei dem der Accountant versucht, eine Zeile zu lesen, die vom Sales Manager geändert wird, und zwei verschiedene Ergebnisse während derselben Transaktion erhält.
Voraussetzungen
In dieser Lektion wird davon ausgegangen, dass Sie die Rollen und Privilegien haben, die im Abschnitt "Privilegien" am Anfang dieser praktischen Einführung aufgeführt sind: Praktische Einführung: Einführung in nicht-wiederholbare Lesevorgänge.
Setzen Sie die Isolationsstufe für die Verbindung des "Accountants" auf 1, indem Sie die folgende Anweisung ausführen:
SET TEMPORARY OPTION isolation_level = 1; |
Setzen Sie die Isolationsstufe im Fenster des Sales Managers auf 1, indem Sie die folgende Anweisung ausführen:
SET TEMPORARY OPTION isolation_level = 1; |
Führen Sie als Accountant die folgende Anweisung aus, um die Preise der Schirmmützen aufzulisten:
SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
ID | Name | UnitPrice |
---|---|---|
300 | Tee Shirt | 9.00 |
301 | Tee Shirt | 14.00 |
302 | Tee Shirt | 14.00 |
400 | Baseball Cap | 9.00 |
401 | Baseball Cap | 10.00 |
500 | Visor | 7.00 |
501 | Visor | 7.00 |
... | ... | ... |
Als Sales Manager führen Sie die folgenden Anweisungen aus, um einen neuen Verkaufspreis für die Plastikschirmmütze einzuführen:
SELECT ID, Name, UnitPrice FROM GROUPO.Products WHERE Name = 'Visor'; UPDATE GROUPO.Products SET UnitPrice = 5.95 WHERE ID = 501; COMMIT; SELECT ID, Name, UnitPrice FROM GROUPO.Products WHERE Name = 'Visor'; |
ID | Name | UnitPrice |
---|---|---|
500 | Visor | 7.00 |
501 | Visor | 5.95 |
Vergleichen Sie den Preis für die Schirmmützen (Visor) im Fenster des Sales Managers mit dem Preis für die gleichen Schirmmützen im Fenster des Accountants. Als Accountant führen Sie die SELECT-Anweisung erneut aus und sehen den neuen Verkaufspreis des Sales Managers.
SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
ID | Name | UnitPrice |
---|---|---|
300 | Tee Shirt | 9.00 |
301 | Tee Shirt | 14.00 |
302 | Tee Shirt | 14.00 |
400 | Baseball Cap | 9.00 |
401 | Baseball Cap | 10.00 |
500 | Visor | 7.00 |
501 | Visor | 5.95 |
... | ... | ... |
Diese Inkonsistenz wird nicht-wiederholbarer Lesevorgang genannt, da der Accountant nach dem zweiten Ausführen der gleichen SELECT-Anweisung in der gleichen Transaktion nicht mehr dasselbe Ergebnis erhält.
Hätte der Accountant seine Transaktion beispielsweise vor der erneuten Verwendung von SELECT mit einer COMMIT- oder ROLLBACK-Anweisung abgeschlossen, wäre die Situation anders. Die Datenbank steht für die gleichzeitige Verwendung mehrerer Benutzer zur Verfügung, und es ist absolut zulässig, dass jemand die Werte vor oder nach der Transaktion des Accountants verändert. Die geänderten Ergebnisse sind nur deshalb inkonsistent, da die Änderungen während der Transaktion geschahen. Ein solches Ereignis macht den Ablauf unserialisierbar.
Der Accountant bemerkt dieses Verhalten und beschließt, dass er in Zukunft nicht mehr will, dass sich die Preise ändern, während er sie sich ansieht. Nicht wiederholbare Lesevorgänge werden auf Isolationsstufe 2 eliminiert. Führen Sie als Accountant folgende Anweisungen aus:
SET TEMPORARY OPTION isolation_level = 2; SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
Der Sales Manager entscheidet, dass es besser ist, mit dem Abverkauf der Schirmmützen bis zur nächsten Woche zu warten, damit er den niedrigeren Preis nicht für eine große Bestellung, die er für den nächsten Tag erwartet, hergeben muss. Versuchen Sie als Sales Manager, die folgenden Anweisungen auszuführen. Die Ausführung der Anweisung beginnt und plötzlich scheint das Fenster einzufrieren.
UPDATE GROUPO.Products SET UnitPrice = 7.00 WHERE ID = 501; |
Der Datenbankserver muss auf Isolationsstufe 2 wiederholbare Lesevorgänge garantieren. Da der Accountant Isolationsstufe 2 verwendet, setzt der Datenbankserver eine Lesesperre auf jede Zeile der Tabelle "Products", die vom Accountant gelesen wird. Wenn der "Sales Manager" versucht, den Preis zurück zu ändern, muss seine Transaktion eine Schreibsperre für die Zeile mit den Schirmmützen in der Tabelle "Products" setzen. Da Schreibsperren Exklusivsperren sind, muss seine Transaktion warten, bis die Transaktion des "Accountants" die Lesesperre freigibt.
Der Accountant ist mit der Durchsicht der Preise fertig. Er möchte nicht riskieren, die Datenbank unbeabsichtigt zu ändern, also beendet er seine Transaktion mit einem ROLLBACK-Befehl.
ROLLBACK; |
Wenn der Datenbankserver diese Anweisung ausführt, wird die Transaktion des "Sales Manager" abgeschlossen.
ID | Name | UnitPrice |
---|---|---|
500 | Visor | 7.00 |
501 | Visor | 7.00 |
Der Sales Manager kann nun seine Transaktion abschließen. Er will seine Änderung festschreiben und den ursprünglichen Preis wiederherstellen:
COMMIT; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |