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 Phantomzeilen

 

Lektion 1: Phantomzeilen erstellen

Erstellen Sie eine Phantomzeile, indem der Sales Manager eine Zeile einfügt, während der Accountant benachbarte Zeilen liest. Diese Aktion führt dazu, dass die neue Zeile als Phantom erscheint.

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

 Aufgabe
  1. Setzen Sie die Isolationsstufe im Fenster des Sales Managers und des Accountants auf 2, indem Sie die folgende Anweisung in jedem Fenster ausführen:

    SET TEMPORARY OPTION isolation_level = 2;
  2. Führen Sie als Accountant die folgende Anweisung aus, um alle Abteilungen aufzulisten:

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  3. Der Sales Manager beschließt, eine neue Abteilung aufzubauen, die sich auf den ausländischen Markt konzentriert. Philip Chin, der die Mitarbeiternummer (EmployeeID) 129 hat, leitet die neue Abteilung. Führen Sie als Sales Manager die folgende Anweisung aus, um einen neuen Eintrag für die neue Abteilung zu erstellen, der als neue Zeile am Ende der Tabelle im Sales Manager-Fenster erscheint:

    INSERT INTO GROUPO.Departments
       ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 600, 'Foreign Sales', 129 );
       COMMIT;
  4. Führen Sie als Sales Manager die folgende Anweisung aus, um alle Abteilungen aufzulisten:

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  5. Der Accountant weiß aber nichts von der neuen Abteilung. Bei Isolationsstufe 2 bringt der Datenbankserver Sperren an, um zu gewährleisten, dass sich keine Zeile verändert, bringt aber keine Sperren an, die verhindern, dass andere Transaktionen neue Zeilen einfügen.

    Der Accountant findet die neue Zeile nur, wenn er noch einmal die SELECT-Anweisung ausführt. Führen Sie als Accountant erneut die SELECT-Anweisung aus, um die neue Zeile, die der Tabelle hinzugefügt wurde, zu sehen.

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129

    Die neue Zeile wird als Phantomzeile bezeichnet, da sie vom Blickwinkel des "Accountants" aus wie eine Erscheinung aus dem Nichts aufgetaucht ist. Der Accountant ist auf Isolationsstufe 2 verbunden. Auf dieser Stufe setzt der Datenbankserver nur Sperren für Zeilen, die er verwendet. Die anderen Zeilen bleiben unberührt. Daher hält den "Sales Manager" nichts davon ab, eine neue Zeile einzufügen.

  6. Der Accountant möchte in Zukunft solche Überraschungen vermeiden und erhöht daher die Isolationsstufe seiner gegenwärtigen Transaktion auf 3. Führen Sie als Accountant die folgenden Anweisungen aus:

    SET TEMPORARY OPTION isolation_level = 3;
    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
  7. Der Sales Manager möchte gerne eine zweite Abteilung hinzufügen, die sich auf Verkaufsinitiativen für Großkunden konzentriert. Führen Sie als Sales Manager die folgende Anweisung aus:

    INSERT INTO GROUPO.Departments
     ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 700, 'Major Account Sales', 902 );

    Während der Ausführung wird das Fenster des Sales Managers angehalten, da die Sperren des Accountants die Anweisung blockieren. Klicken Sie in der Symbolleiste auf Stopp, um diesen Eintrag zu unterbrechen.

    Als der Accountant die Isolationsstufe auf 3 erhöhte und noch einmal alle Zeilen in der Tabelle "Departments" auswählte, brachte der Datenbankserver Anti-Einfügesperren für jede Zeile der Tabelle an. Außerdem setzte er eine zusätzliche Phantomsperre, um Eingaben am Ende der Tabelle zu blockieren. Als der "Sales Manager" versuchte, am Ende der Tabelle eine neue Zeile einzufügen, war es diese letzte Sperre, die seine Anweisung blockierte.

    Beachten Sie, dass die Sales Manager-Anweisung blockiert wurde, obwohl noch eine Verbindung auf Isolationsstufe 2 bestand. Der Datenbankserver platziert Anti-Einfügesperren, wie Lesesperren, entsprechend den Anforderungen der Isolationsstufe und den Anweisungen jeder Transaktion. Sobald diese Sperren angebracht sind, müssen sie von allen anderen gleichzeitig ablaufenden Transaktionen respektiert werden.

  8. Um zu vermeiden, dass die SQL Anywhere-Beispieldatenbank geändert wird, sollten Sie die unvollständige Transaktion zurücksetzen, welche die Zeile "Major Account Sales" einfügt, und eine zweite Transaktion benutzen, um die Abteilung "Foreign Sales" zu löschen.

    1. Führen Sie als Accountant die folgende Anweisung aus, um die Isolationsstufe zu senken, sodass der Sales Manager Änderungen in der Datenbank rückgängig machen kann:

      SET TEMPORARY OPTION isolation_level=3;
    2. Führen Sie als Sales Manager die folgenden Anweisungen aus, um die aktuelle Transaktion zurückzusetzen, die gerade eingefügte Zeile zu löschen und diesen Vorgang festzuschreiben.

      ROLLBACK;
      DELETE FROM GROUPO.Departments
      WHERE DepartmentID = 600;
      COMMIT;

Ergebnisse

Der Accountant erhält unterschiedliche Ergebnisse jedes Mal, wenn die SELECT-Anweisung ausgeführt wird, daher aktiviert er die Snapshot-Isolation Stufe 3 zur Vermeidung von Phantomzeilen. Die Änderung des Accountants in der Datenbank hindert den Sales Manager, daran, Änderungen an der Datenbank durchzuführen.

 Siehe auch