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 Phantomzeilen

 

Lektion 1: Erstellen von Phantomzeilen

 Erstellen einer Phantomzeile
  1. Starten Sie zwei Instanzen von Interactive SQL. Siehe die Schritte 1 bis 4 unter Praktische Einführung: Einführung in nicht-wiederholbare Lesevorgänge

  2. Setzen Sie die Isolationsstufe im Fenster des "Sales Managers" auf 2, indem Sie die folgende Anweisung ausführen:

    SET TEMPORARY OPTION isolation_level = 2;
  3. Stellen Sie die Isolationsstufe im Fenster des "Accountants" auf 2, indem Sie die folgende Anweisung ausführen:

    SET TEMPORARY OPTION isolation_level = 2;
  4. Geben Sie im Fenster des "Accountants" die folgende Anweisung ein, um alle Abteilungen aufzulisten:

    SELECT * FROM Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  5. 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.

    INSERT INTO Departments
       ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 600, 'Foreign Sales', 129 );
    COMMIT;

    Die letzte Anweisung erstellt den Eintrag für die neue Abteilung ("Foreign Sales"). Sie erscheint als neue Zeile am Ende der Tabelle im Fenster des "Sales Managers".

    Geben Sie im Fenster des "Sales Managers" die folgende Anweisung ein, um alle Abteilungen aufzulisten:

    SELECT *
    FROM 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
  6. 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 im Fenster des "Accountants" noch einmal den SELECT-Befehl aus. Sie sehen nun die neue Zeile, die der Tabelle hinzugefügt wurde.

    SELECT *
    FROM 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.

  7. Der "Accountant" möchte in Zukunft solche Überraschungen vermeiden und erhöht daher die Isolationsstufe seiner gegenwärtigen Transaktion auf 3. Geben Sie die folgenden Anweisungen für den "Accountant" ein.

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

    INSERT INTO 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 (oder klicken Sie auf SQL » Stopp), um diesen Eintrag zu unterbrechen.

  9. 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 die folgende Anweisung im Fenster des "Sales Managers" aus, um die letzte, unvollständige Transaktion zurückzusetzen:

      ROLLBACK;
    2. Führen Sie im Fenster "Sales Manager" die folgenden beiden Anweisungen aus, um die Zeile zu löschen, die Sie zuvor eingefügt haben, und diesen Vorgang festzuschreiben.

      DELETE FROM Departments
      WHERE DepartmentID = 600;
      COMMIT;
 Erklärung
 Siehe auch