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.
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" |
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" |
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; |
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 | ... |
... | ... | ... | ... | ... | ... | ... |
Führen Sie in "Connection2" den folgenden Befehl aus:
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
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.
Führen Sie in "Connection2" den folgenden Befehl aus:
ROLLBACK; |
Die Transaktion in "Connection2" wird abgeschlossen, und die SELECT-Anweisung in "Connection1" wird fortgesetzt.
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'; |
Führen Sie in "Connection 1" folgenden Befehl aus, um die Isolationsstufe auf "statement-snapshot" zu setzen:
SET TEMPORARY OPTION isolation_level = 'statement-snapshot'; |
Führen Sie in "Connection1" die folgende Anweisung aus:
SELECT * FROM Products; |
Führen Sie in "Connection2" die folgende Anweisung aus:
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
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.
Schließen Sie in "Connection2" die Transaktion ab, indem Sie folgenden Befehl ausführen:
COMMIT; |
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 | ... |
... | ... | ... | ... | ... | ... | ... |
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:
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |