Mehrere Transaktionen können gleichzeitig auf das gleiche Datenbankobjekt, z. B. eine Tabelle, zugreifen. Um die Transaktionen voneinander zu isolieren, setzt das Datenbanksystem Sperren für Datenbankobjekte.
Arten von Sperren
Name |
Objekte, die gesperrt werden können |
Lesesperre (SHARE LOCK) |
Tabellen, Zeilen, Datenbankkatalog |
Schreibsperre (EXCLUSIVE LOCK) |
Tabellen, Zeilen, Datenbankkatalog |
Zeilen |
Sperren können folgendermaßen angefordert werden:
● Sperren für Zeilen oder Tabellen können implizit vom Datenbanksystem angefordert/freigeben oder explizit von einem Benutzer angefordert/freigegeben werden (siehe SQL-Referenzhandbuch, LOCK-Anweisung und LOCK-Option (lock_option)).
● Sperren auf dem Datenbankkatalog werden immer implizit vom Datenbanksystem angefordert und freigeben.
Mit dem Isolation-Level legen Sie fest, wann das Datenbanksystem welche Art von Sperre setzt. Damit bestimmen Sie den Grad der Parallelität von Transaktionen und die Phänomene, die auftreten können. Sie können das Isolation-Level beim Eröffnen einer Datenbanksitzung angeben. Wenn Sie kein Isolation-Level angeben, dann verwendet das Datenbanksystem den Vorschlagswert.
In Abhängigkeit vom Isolation-Level fordert das Datenbanksystem dann während der Abarbeitung der SQL-Anweisungen die erforderlichen Sperren an. Alle ändernden SQL-Anweisungen (z. B. INSERT, UPDATE, DELETE) fordern stets eine Schreibsperre an.
Um für eine Transaktion explizit Sperren anzufordern, können Sie die LOCK-Anweisung verwenden.
Um einzelne Zeilen einer Tabelle zu sperren, können Sie die LOCK-Option innerhalb einer SQL-Anweisung verwenden. Dies ist in jedem Isolation-Level möglich. Mit der LOCK-Option können Sie auch für einzelne SQL-Anweisungen den Isolation-Level zeitweilig übersteuern.
Wenn in einer Tabelle von einer Transaktion zu viele Zeilensperren angefordert werden, dann versucht das Datenbanksystem, dafür eine Tabellensperre zu setzen. Die Grenze, ab der das Datenbanksystem versucht, Zeilensperren in eine Tabellensperre zu verwandeln, konfigurieren Sie mit dem allgemeinen Datenbankparameter MAXLOCKS.
Art der Sperre |
Freigabe |
explizit vom Benutzer mit der LOCK-Anweisung angefordert |
Das Datenbanksystem gibt die Sperre nach dem Ende der Transaktion frei. Ausnahmen: Wenn die COMMIT-Anweisung oder die ROLLBACK-Anweisung eine LOCK-Anweisung enthalten, gibt das Datenbanksystem die Sperren am Ende der Transaktion nicht frei. |
implizit gesetzte Lesesperre |
abhängig vom Isolation-Level |
implizit gesetzte Schreibsperre Schreibsperre für geänderte Zeilen Schreibsperren, die durch eine ändernde SQL-Anweisung angefordert wurden Tabellensperren |
Das Datenbanksystem gibt die Sperre erst nach dem Ende der gesamten Transaktion frei. |
Schreibsperre für noch nicht geänderte Zeilen Lesesperren für Zeilen |
Sie können diese Sperren mit einer UNLOCK-Anweisung freigeben. Siehe SQL-Referenzhandbuch, UNLOCK-Anweisung (unlock_statement). |
Mit dem speziellen Datenbankparameter REQUEST_TIMEOUT begrenzen Sie, wieviel Zeit maximal vergehen darf, bis das Datenbanksystem eine Sperre aufhebt (Timeout).
Sie können sich Informationen zu Sperren folgendermaßen anzeigen lassen:
● Database Manager GUI, Datenbankaktivitäten anzeigen
● In SAP-Systemen verwenden Sie das CCMS, siehe Datenbankverwaltung im CCMS, SQL-Sperren
Die Systemtabelle LOCKS enthält Informationen zu Sperren, die Systemtabelle LOCK_WAITS Informationen zu den Sperranforderungen.
Siehe auch: