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 2: Phantomzeilen mithilfe der Snapshot-Isolation vermeiden

Sie können die Snapshot-Isolationsstufe verwenden, um die Konsistenz auf der gleichen Stufe aufrechtzuerhalten wie auf Isolationsstufe 3, ohne dass es zu Blockierungen kommt. Die Anweisung des Sales Managers wird nicht blockiert und der Accountant sieht keine Phantomzeile.

Voraussetzungen

In dieser Lektion wird davon ausgegangen, dass Sie bereits alle vorherigen Lektionen abgeschlossen haben. Siehe Lektion 1: Phantomzeilen erstellen.

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. Führen Sie als Accountant die folgenden Anweisungen aus, um die Snapshot-Isolation zu aktivieren:

    SET OPTION PUBLIC. allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. Führen Sie 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 kann seine Abfrage erneut ausführen und sieht die neue Zeile nicht, da die Transaktion nicht festgeschrieben wurde.

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

    Die Änderung des Sales Managers wird nicht blockiert, da der Accountant die Snapshot-Isolation benutzt.

  7. Der Accountant muss seine Snapshot-Transaktion beenden, um die Änderungen zu sehen, die der Sales Manager in der Datenbank festgeschrieben hat.

    COMMIT;
       SELECT * FROM GROUPO.Departments
       ORDER BY DepartmentID;

    Nun sieht der Accountant die Abteilung "Foreign Sales", nicht aber die Abteilung "Major Account Sales".

    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  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 Sales Manager die folgende Anweisung 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

Sie haben erfolgreich versucht, Phantomzeilen durch die Snapshot-Isolation zu vermeiden.