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 - SQL-Benutzerhandbuch » Datenbanken erstellen » Transaktionen und Isolationsstufen verwenden » Funktionsweise von Sperren » Zeilensperren

 

Absichtssperren

Absichtssperren, die auch als Sperren für beabsichtigte Aktualisierungen bezeichnet werden, geben an, dass eine Absicht zum Ändern einer bestimmten Zeile besteht. Absichtssperren werden in folgenden Situationen gesetzt:

  • Eine Transaktion führt eine FETCH FOR UPDATE-Anweisung aus.

  • Eine Transaktion führt eine SELECT ... FOR UPDATE BY LOCK-Anweisung aus.

  • Eine Transaktion benutzt SQL_CONCUR_LOCK als Parallelitätsbasis in einer ODBC-Anwendung (durch den Parameter SQL_ATTR_CONCURRENCY des ODBC API-Aufrufs SQLSetStmtAttr).

Absichtssperren verursachen keine Konflikte mit Lesesperren, sodass das Setzen einer Absichtssperre andere Transaktionen nicht davon abhält, die gleiche Zeile zu lesen. Absichtssperren verhindern jedoch, dass andere Transaktionen eine Absichts- oder Schreibsperre für dieselbe Zeile setzen, und garantieren damit, dass die Zeile vor einer Aktualisierung nicht von einer anderen Transaktion geändert wird.

Wenn eine Absichtssperre von einer Transaktion angefordert wird, die mit Snapshot-Isolation ausgeführt wird, wird die Absichtssperre nur gesetzt, wenn es sich bei der Zeile um eine nicht geänderte Zeile in der Datenbank handelt, die allen parallelen Transaktionen zur Verfügung steht. Wenn es sich bei der Zeile jedoch um eine Snapshot-Kopie handelt, wird keine Absichtssperre gesetzt, da die Originalzeile bereits durch eine andere Transaktion geändert wurde. Jeder Versuch der Snapshot-Transaktion, die Zeile zu aktualisieren, schlägt fehl, und es wird ein Snapshot-Aktualisierungskonflikt gemeldet.