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

SQL Anywhere 12.0.1 (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: Erstellen von nicht wiederholbaren Lesevorgängen

 Erstellen eines nicht-wiederholbaren Lesevorgangs
  1. Starten Sie Interactive SQL.

  2. Im Fenster Verbinden stellen Sie als "Sales Manager" eine Verbindung mit der SQL Anywhere-Beispieldatenbank her.

    1. Wählen Sie in der Dropdown-Liste Aktion die Option Mit ODBC-Datenquelle verbinden.

    2. Klicken Sie auf ODBC-Datenquellenname und geben Sie im Feld darunter SQL Anywhere 12 Demo ein.

    3. Klicken Sie, falls erforderlich, auf Erweitert, um die Registerkarte Erweiterte Optionen einzublenden.

    4. Klicken Sie auf die Registerkarte Erweitert und geben Sie Sales Manager in das Feld ConnectionName ein.

    5. Klicken Sie auf Verbinden.

  3. Starten Sie eine zweite Instanz von Interactive SQL.

  4. Im Fenster Verbinden stellen Sie als "Accountant" eine Verbindung mit der SQL Anywhere-Beispieldatenbank her.

    1. Wählen Sie in der Dropdown-Liste Aktion die Option Mit ODBC-Datenquelle verbinden.

    2. Klicken Sie auf ODBC-Datenquellenname und geben Sie im Feld darunter SQL Anywhere 12 Demo ein.

    3. Klicken Sie, falls erforderlich, auf Erweitert, um die Registerkarte Erweiterte Optionen einzublenden.

    4. Klicken Sie auf die Registerkarte Erweitert und geben Sie Accountant in das Feld ConnectionName ein.

    5. Klicken Sie auf Verbinden.

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

    SET TEMPORARY OPTION isolation_level = 1;
  7. Der "Accountant" beschließt, die Preise für die Schirmmützen (Visors) aufzulisten. Führen Sie als "Accountant" die folgende Anweisung aus:

    SELECT ID, Name, UnitPrice FROM 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
    ... ... ...
  8. Der "Sales Manager" beschließt, für die Schirmmützen einen neuen Verkaufspreis festzusetzen. Führen Sie als "Sales Manager" die folgenden Anweisungen aus:

    SELECT ID, Name, UnitPrice FROM Products
    WHERE Name = 'Visor';
    UPDATE Products
    SET UnitPrice = 5.95 WHERE ID = 501;
    COMMIT;
    SELECT ID, Name, UnitPrice FROM Products
    WHERE Name = 'Visor';
    ID Name UnitPrice
    500 Visor 7.00
    501 Visor 5.95
  9. 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". Der "Accountant" führt die SELECT-Anweisung erneut aus und sieht den neuen Verkaufspreis des "Sales Managers".

    SELECT ID, Name, UnitPrice
    FROM 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" ein zweites Mal die gleiche SELECT-Anweisung in der gleichen Transaktion ausführt und 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 das Schema unserialisierbar.

  10. 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 Products;
  11. 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, in seinem Fenster die folgenden Anweisungen auszuführen. Die Ausführung der Anweisung beginnt und plötzlich scheint sein Fenster einzufrieren.

    UPDATE 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.

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

    COMMIT;
 Sperrentypen und verschiedene Isolationsstufen
 Transaktion blockieren
 Siehe auch