Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » Einführung in die Programmierung mit SQL Anywhere » SQL in Anwendungen verwenden » Mit Cursor arbeiten

 

Aktualisierbare Anweisungen

Dieser Abschnitt beschreibt, wie Klauseln in der SELECT-Anweisung aktualisierbare Anweisungen und Cursor beeinflussen.

Aktualisierbarkeit von schreibgeschützten Anweisungen

Die Angabe von FOR READ ONLY in der Cursordeklaration oder die Aufnahme einer FOR READ ONLY-Klausel in die Anweisung führt dazu, dass die Anweisung schreibgeschützt ist. D.h., dass eine FOR READ ONLY-Klausel oder die entsprechende schreibgeschützte Cursordeklaration bei Verwendung einer Client-API jede andere Aktualisierbarkeitsangabe außer Kraft setzt.

Wenn der äußerste Block einer SELECT-Anweisung eine ORDER BY-Klausel enthält und in der Anweisung kein FOR UPDATE angegeben wird, ist der Cursor READ ONLY. Wenn die SQL SELECT-Anweisung FOR XML angibt, ist der Cursor READ ONLY. Andernfalls ist der Cursor aktualisierbar.

Aktualisierbare Anweisungen und Parallelitätssteuerung

Bei aktualisierbaren Anweisungen stellt SQL Anywhere optimistische und pessimistische Parallelitätssteuerungsmechanismen für Cursor zur Verfügung, um zu gewährleisten, dass eine Ergebnismenge während Abrollvorgängen konsistent bleibt. Diese Mechanismen stellen eine Alternative zur Verwendung eines INSENSITIVE-Cursors oder einer Snapshot-Isolation dar, auch wenn sie eine andere Semantik verwenden und andere Nachteile haben.

Die Angabe FOR UPDATE kann sich darauf auswirken, ob ein Cursor aktualisierbar ist. In SQL Anywhere hat die FOR UPDATE-Syntax allerdings keine weiteren Auswirkungen auf die Parallelitätssteuerung. Wenn FOR UPDATE mit zusätzlichen Parametern angegeben ist, ändert SQL Anywhere die Verarbeitung der Anweisung, um eine von zwei Parallelitätssteuerungsoptionen wie folgt einzubeziehen:

  • Pessimistisch   Für alle in die Ergebnismenge des Cursors abgerufene Zeilen erwirbt der Datenbankserver Absichtszeilensperren, um zu verhindern, dass die Zeilen von einer anderen Transaktion aktualisiert werden.

  • Optimistisch   Der vom Datenbankserver verwendete Cursortyp wird zu einem Keyset-gesteuerten Cursor (unempfindliche Mitgliedschaft, wertempfindlich), damit die Anwendung benachrichtigt werden kann, wenn eine Zeile im Ergebnis von dieser oder einer anderen Transaktion geändert oder gelöscht wurde.

Pessimistische oder optimistische Parallelität wird auf der Cursorebene angegeben, und zwar entweder mittels DECLARE CURSOR- bzw. FOR-Anweisungen, oder mittels der Parallelitätseinstellung API bei einer spezifischen Programmierschnittstelle. Wenn eine Anweisung aktualisierbar ist und der Cursor keinen Parallelitätssteuerungsmechanismus angibt, wird die Angabe der Anweisung verwendet. Die Syntax lautet wie folgt:

  • FOR UPDATE BY LOCK   Der Datenbankserver erwirbt Absichtszeilensperren für abgerufene Zeilen der Ergebnismenge. Dies sind langfristige Sperren, die bis zum COMMIT oder ROLLBACK der Transaktion gehalten werden..

  • FOR UPDATE BY { VALUES | TIMESTAMP }   Der Datenbankserver verwendet einen keyset-driven Cursor, damit die Anwendung benachrichtigt werden kann, wenn Zeilen geändert oder gelöscht werden, während die Ergebnismenge durchlaufen wird.

Weitere Hinweise finden Sie unter DECLARE-Anweisung und FOR-Anweisung.

Aktualisierbare Anweisungen beschränken

FOR UPDATE ( Spaltenliste ) erzwingt die Beschränkung, dass nur benannte Ergebnismengenattribute in einer nachfolgenden UPDATE WHERE CURRENT OF-Anweisung geändert werden können.