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 » Isolationsstufen und Konsistenz » Snapshot-Isolation

 

Beispiel einer Snapshot-Isolation

Im folgenden Beispiel werden zwei Verbindungen zur SQL Anywhere-Beispieldatenbank benutzt, um zu zeigen, wie die Snapshot-Isolation eingesetzt werden kann, um Konsistenz ohne Blockierungen zu gewährleisten.

 ♦  So verwenden Sie die Snapshot-Isolation
  1. Führen Sie den folgenden Befehl aus, um eine Interactive SQL-Verbindung (Connection1) zur SQL Anywhere-Beispieldatenbank herzustellen:

    dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection1"
  2. Führen Sie den folgenden Befehl aus, um eine Interactive SQL-Verbindung (Connection2) zur SQL Anywhere-Beispieldatenbank herzustellen:

    dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection2"
  3. Führen Sie in "Connection1" den folgenden Befehl aus, um die Isolationsstufe auf 1 zu setzen ("read committed", d.h., festgeschriebene Daten lesen), mit der eine Lesesperre für die aktuelle Zeile gesetzt und gehalten wird.

    SET OPTION isolation_level = 1;
  4. Führen Sie in "Connection1" den folgenden Befehl aus:

    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  5. Führen Sie in "Connection2" den folgenden Befehl aus:

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  6. Führen Sie in "Connection1" erneut die Anweisung SELECT aus:

    SELECT * FROM Products;

    Die SELECT-Anweisung wird gesperrt und kann nicht fortfahren, da die Anweisung UPDATE in "Connection2" weder festgeschrieben noch zurückgesetzt wurde. Die SELECT-Anweisung muss auf den Abschluss der Transaktion in "Connection2" warten, bevor sie fortfahren kann. Damit wird sichergestellt, dass die SELECT-Anweisung keine nicht festgeschriebenen Daten in das Ergebnis einliest.

  7. Führen Sie in "Connection2" den folgenden Befehl aus:

    ROLLBACK;

    Die Transaktion in "Connection2" wird abgeschlossen, und die SELECT-Anweisung in "Connection1" wird fortgesetzt.

  8. Mit der Snapshot-Isolationsstufe der Anweisung wird die gleiche Parallelität wie mit Isolationsstufe 1 erreicht, jedoch ohne Blockierungen.

    Führen Sie in "Connection1" den folgenden Befehl aus, um die Snapshot-Isolation zu erlauben:

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
  9. Führen Sie in "Connection 1" folgenden Befehl aus, um die Isolationsstufe auf "statement-snapshot" zu setzen:

    SET TEMPORARY OPTION isolation_level = 'statement-snapshot';
  10. Führen Sie in "Connection1" die folgende Anweisung aus:

    SELECT * FROM Products;
  11. Führen Sie in "Connection2" die folgende Anweisung aus:

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  12. Führen Sie in "Connection1" erneut die Anweisung SELECT aus:

    SELECT * FROM Products;

    Die SELECT-Anweisung wird ohne Sperren ausgeführt, umfasst jedoch nicht die Daten aus der UPDATE-Anweisung, die durch "Connection2" ausgeführt wurde.

  13. Schließen Sie in "Connection2" die Transaktion ab, indem Sie folgenden Befehl ausführen:

    COMMIT;
  14. Schließen Sie in "Connection1" die Transaktion ab (die Abfrage der Tabelle "Products") und führen Sie dann die SELECT-Anweisung erneut aus, um die aktualisierten Daten anzuzeigen:

    COMMIT;
    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 New Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  15. Machen Sie die Änderungen der SQL Anywhere-Beispieldatenbank mit folgender Anweisung rückgängig:

    UPDATE Products
    SET Name = 'Tee Shirt'
    WHERE id = 302;
    COMMIT;

Weitere Beispiele zur Snapshot-Isolation finden Sie unter: