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

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Transaktionen und Isolationsstufen verwenden » Praktische Einführung in Isolationsstufen

 

Praktische Einführung: Nicht-wiederholbare Lesevorgänge

Das Beispiel in Praktische Einführung: Dirty Reads hat den ersten Typ von Inkonsistenz vorgeführt, nämlich Dirty Reads. In diesem Beispiel führte ein "Accountant" eine Berechnung aus, während der "Sales Manager" dabei war, einen Preis heraufzusetzen. Die Berechnung des "Accountants" beruhte auf fehlerhaften Daten, die der "Sales Manager" eingegeben hatte und gerade korrigieren wollte.

Das folgende Beispiel zeigt eine andere Art von Inkonsistenz: Nicht-wiederholbare Lesevorgänge. In diesem Beispiel spielen Sie die Rolle derselben zwei Mitarbeiter, die die SQL Anywhere-Beispieldatenbank gleichzeitig benutzen. Der "Sales Manager" möchte für Plastik-Schirmmützen einen neuen Preis anbieten. Der "Accountant" will die Preise für einige Waren auf einer kürzlich getätigten Bestellung überprüfen.

Dieses Beispiel beginnt mit beiden Verbindungen auf Isolationsstufe 1 und nicht auf Isolationsstufe 0, was die Standardisolation für die Beispieldatenbank wäre, die mit SQL Anywhere bereitgestellt wird. Indem die Isolationsstufe auf 1 gesetzt wird, vermeiden Sie die Art von Inkonsistenz, die in der vorherigen praktischen Einführung aufgezeigt wurde, nämlich Dirty Reads.

Hinweis

Damit diese praktische Einführung funktioniert, darf die Option Datenbanksperren automatisch freigeben in Interactive SQL (Extras » Optionen » SQL Anywhere) nicht aktiviert sein.

  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 einer ODBC-Datenquelle verbinden.

    2. Im Feld ODBC-Datenquellenname wählen Sie SQL Anywhere 12 Demo.

    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 einer ODBC-Datenquelle verbinden.

    2. Im Feld ODBC-Datenquellenname wählen Sie SQL Anywhere 12 Demo.

    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 "Accountant" auf 1, indem Sie den folgenden Befehl ausführen.

    SET TEMPORARY OPTION isolation_level = 1;
  6. Setzen Sie die Isolationsstufe im Fenster des "Sales Managers" auf 1, indem Sie den folgenden Befehl 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" folgenden Befehl 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" folgenden Befehl 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 mit einem COMMIT- oder ROLLBACK-Befehl beendet, bevor er wiederum den SELECT-Befehl angewendet hätte, wäre die ganze Sache anders verlaufen. 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 des Befehls 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
 Snapshot-Isolation zur Vermeidung von nicht wiederholbaren Lesevorgängen verwenden