Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Transaktionen und Isolationsstufen » Praktische Einführung in Isolationsstufen » Praktische Einführung: Einführung in nicht-wiederholbare Lesevorgänge

 

Lektion 1: Nicht wiederholbaren Lesevorgang erstellen

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.

 Aufgabe
  1. 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;
  2. Setzen Sie die Isolationsstufe im Fenster des Sales Managers auf 1, indem Sie die folgende Anweisung ausführen:

    SET TEMPORARY OPTION isolation_level = 1;
  3. 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
    ... ... ...
  4. 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
  5. 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.

  6. 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;
  7. 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.

  8. 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
  9. Der Sales Manager kann nun seine Transaktion abschließen. Er will seine Änderung festschreiben und den ursprünglichen Preis wiederherstellen:

    COMMIT;

Ergebnisse

Der Accountant erhält unterschiedliche Ergebnisse in derselben Transaktion. Er aktiviert daher die Snapshot-Isolation Stufe 2 zur Vermeidung von nicht wiederholbaren Lesevorgängen. Die Änderung des Accountants in der Datenbank hindert den Sales Manager, daran, Änderungen an der Datenbank durchzuführen.

Als Sie die Isolation des Accountants von Stufe 1 auf Stufe 2 erhöht haben, hat der Datenbankserver Lesesperren verwendet, wo es vorher keine gab. Ab da setzte er eine Lesesperre für seine Transaktion, und zwar für jede Zeile, die der Accountant auswählte.

In der vorigen praktischen Einführung fror das Fenster des "Sales Managers" während der Ausführung der UPDATE-Anweisung ein. Der Datenbankserver begann die Anweisung auszuführen, als er feststellte, dass die Transaktion des "Accountants" eine Lesesperre für die Zeile gesetzt hatte, die der Sales Manager ändern musste. An diesem Punkt setzte der Datenbankserver einfach mit der Ausführung der Aktualisierung aus. Sobald der Accountant seine Transaktion mit dem ROLLBACK-Befehl abgeschlossen hatte, gab der Datenbankserver seine Sperren automatisch frei. Da es keine weiteren Hindernisse mehr gab, beendete der Datenbankserver die Ausführung des UPDATE-Befehls des Sales Managers.

 Siehe auch