Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

SQL-Transaktion

Eine SQL-Transaktion ist eine Folge von zusammengehörigen SQL-Anweisungen, die eine Datenbank von einem konsistenten Zustand in einen anderen konsistenten Zustand überführt. Änderungen in Tabellen sind nach Ende einer SQL-Transaktion entweder vollständig oder überhaupt nicht ausgeführt.

Eine SQL-Transaktion beginnt, wenn keine andere Transaktion im Gang ist und eine SQL-Anweisung ausgeführt wird, die eine Transaktion einleitet. SQL-Anweisungen, die eine Transaktion einleiten, sind alle SQL-Anweisungen außer den folgenden SQL-Anweisungen::

  • ALTER TABLE mit dem Pragma UTILITY MODE ON

  • DECLARE CURSOR (nicht ausführbar)

  • PERMIT

  • SET CATALOG

  • SET SCHEMA

  • SET SESSION AUTHORIZATION

  • SET TRANSACTION

  • WHENEVER (nicht ausführbar)

  • Utility-Anweisungen

Die Anweisungen EXECUTE und EXECUTE IMMEDIATE leiten eine Transaktion ein, wenn die betreffende dynamisch ausführbare Anweisung eine Transaktion einleitet.

In SESAM/SQL dürfen SQL-Anweisungen zum Abfragen und Ändern von Daten (siehe "SQL-Anweisungen zum Abfragen und Ändern von Daten") nicht in einer Transaktion ausgeführt werden, in der eine SQL-Anweisung zur Schemadefinition und -verwaltung, zur Verwaltung der Speicherstruktur oder zur Verwaltung von Benutzereinträgen ausgeführt wird. Die Anweisungen SET SESSION AUTHORIZATION und SET TRANSACTION sowie Utility-Anweisungen können nur außerhalb einer Transaktion ausgeführt werden. Eine Utility-Anweisung wird über eine Folge interner Transaktionen abgewickelt und ist deshalb nicht rücksetzbar.

Eine SQL-Transaktion endet, wenn die SQL-Anweisung COMMIT [WORK] oder die SQL-Anweisung ROLLBACK [WORK] ausgeführt wird, bzw., wenn sie intern vom DBH zurückgesetzt wird.

Änderungen in der Datenbank seit dem Beginn einer bestimmten Transaktion werden erst festgeschrieben, wenn eine COMMIT-Anweisung erfolgreich durchgeführt wurde (Ausnahme: autonome Transaktionen, siehe "SQL-Transaktion").

Wird eine Transaktion durch ROLLBACK beendet, dann werden alle Änderungen in der Datenbank seit dem Beginn der Transaktion rückgängig gemacht.

Tritt innerhalb einer Transaktion ein nicht behebbarer Fehler, ein Longlock oder Deadlock auf, führt SESAM/SQL einen impliziten ROLLBACK WORK aus.

Wird mit openUTM gearbeitet, dann wird die Transaktionsbeendigung ausschließlich mit UTM-Sprachmitteln durchgeführt. In UTM-Anwendungen dürfen die SQL-Anweisungen COMMIT und ROLLBACK nicht verwendet werden. Eine UTM-Transaktion endet mit dem Setzen eines Sicherungspunktes.

Eine SQL-Transaktion ist durch einen bestimmten Isolationslevel (siehe "SQL-Transaktion") und einen bestimmten Transaktionsmodus (siehe "SQL-Transaktion") charakterisiert. Isolationslevel und Transaktionsmodus können mit der SQL-Anweisung SET TRANSACTION festgelegt werden. Die mit SET TRANSACTION festgelegten Einstellungen sind jeweils nur für die SQL-Anweisungen der unmittelbar folgenden Transaktion gültig. Dabei ist es gleichgültig, ob es sich um eine SQL- oder CALL-DML-Transaktion oder eine gemischte Transaktion handelt. Nach dem Ende der Transaktion gelten wieder die Voreinstellungen.

Mit einer autonomen Transaktion (siehe "SQL-Transaktion") können Sie Daten unabhängig vom Ausgang der umgebenden Transaktion in eine Datenbank schreiben.

Isolationslevel

Der Isolationslevel gibt an, wie stark das konsistente Lesen von Sätzen in einer Transaktion durch schreibende konkurrierende Zugriffe einer anderen Transaktion beeinträchtigt werden darf. Konkurrierende Zugriffe sind gleichzeitige Zugriffsversuche von zwei oder mehreren Anwenderprogrammen auf einen Satz. Folgende Phänomene können bei konkurrierenden Zugriffen je nach gewähltem Isolationslevel auftreten:

  • dirty read (schmutziges Lesen)
    Eine Transaktion ändert einen Satz oder nimmt einen Satz neu auf. Eine zweite Transaktion liest diesen geänderten bzw. neuen Satz, bevor die erste Transaktion die Änderung festgeschrieben hat. Damit hat die zweite Transaktion einen Satz gelesen, der von der ersten noch geändert oder gelöscht werden kann, also noch nicht den endgültigen Zustand hat.

  • non-repeatable read (nicht wiederholbares Lesen)
    Eine Transaktion liest einen Satz. Während diese Transaktion noch offen ist, ändert oder löscht eine zweite Transaktion diesen Satz und schreibt diese Änderung oder Löschung fest. Ein erneuter Zugriffsversuch der ersten Transaktion auf diesen Satz liefert dann veränderte Werte oder bleibt erfolglos.

  • phantoms (Phantome)
    Eine Transaktion wählt mit einer Abfrage Sätze aus einer Tabelle auf Grund einer bestimmten Bedingung aus. Während diese Transaktion noch offen ist, nimmt eine zweite Transaktion Sätze in die Tabelle auf, die ebenfalls dieser Bedingung genügen. Wiederholt die erste Transaktion dieselbe Abfrage, so enthält die Ergebnistabelle auch die neu aufgenommenen Sätze.

Aus Kompatibilitätsgründen kann statt des Isolationslevels auch mit CONSISTENCY LEVEL der Konsistenzlevel angegeben werden.

Die folgende Tabelle zeigt die Zuordnung von Konsistenzlevel, Isolationslevel und Phänomenen, die jeweils auftreten können:

Isolationslevel

Konsistenzlevel

dirty read

non-repeatable read

phantoms

READ UNCOMMITTED

0

x

x

x

-

1

x

x1

x

READ COMMITTED

2

-

x

x

REPEATABLE READ

3

-

-

x

SERIALIZABLE

4

-

-

-

Tabelle 35: Isolationslevel, Konsistenzlevel und zugeordnete Phänomene

1Das Phänomen non-repeatable read kann auftreten, wenn vorher ein Satz mit dirty read gelesen wurde.


Voreinstellung für den Isolationslevel ist SERIALIZABLE, bei dem ein vollständiger Schutz vor konkurrierenden Transaktionen gewährleistet ist. Falls Isolationslevel bzw. Konsistenzlevel in der Konfigurationsdatei des Anwenderprogramms eingetragen sind, gilt der dort eingetragene Wert als Voreinstellung. Dieser Wert darf nicht höher sein als der, der durch die DBH-Option MAX-ISOLATION-LEVEL zugelassen ist. Anderenfalls meldet SESAM/SQL den SQLSTATE 91SCL.

Transaktionsmodus

Der Transaktionsmodus legt fest, ob innerhalb einer Transaktion Sätze nur gelesen oder auch geändert werden dürfen. READ ONLY ist Voreinstellung beim Isolationslevel READ UNCOMMITTED bzw. bei den Konsistenzleveln 0 und 1. Sonst ist READ WRITE die Voreinstellung. READ UNCOMMITTED ist nicht zulässig, wenn gleichzeitig als Transaktionsmodus READ WRITE festgelegt wurde.

Autonome Transaktion

Das Pragma AUTONOMOUS TRANSACTION ermöglicht es, Daten unabhängig vom Ausgang der umgebenden Transaktion in eine Datenbank zu schreiben. Insbesondere werden die Daten persistent in die Datenbank geschrieben, bevor möglicherweise die SQL-Anweisung ROLLBACK WORK der Transaktion ausgeführt wird.

Das Pragma wirkt nur bei ändernden SQL-Anweisungen, also bei INSERT, UPDATE, DELETE (mit Suchbedingung), MERGE und CALL.

Die SQL-Anweisung hinter dem Pragma AUTONOMOUS TRANSACTION wird in der aktuellen Transaktion des Anwenders, aber in einer eigenen Ablaufumgebung (eigenen Thread, eigener Transaktionskontext) ausgeführt.

SQL-Anweisungen des Anwenders zur Transaktionsverwaltung haben keine Wirkung. D.h. die Anweisungen COMMIT WORK bzw. ROLLBACK WORK des Anwenders beeinflussen das persistente Schreiben von Daten durch ändernde SQL-Anweisungen autonomer Transaktionen nicht. Die Anweisung SET TRANSACTION des Anwenders wirkt sich nicht auf autonome Transaktionen aus. Der Transaktionsmodus autonomer Transaktionen ist READ/WRITE und der Isolationslevel ist der maximale Wert, den die DBH-Option erlaubt.

Hinweise zur Benutzer-Identifikation, zu Lock-Konflikten und zum Abbruch der Anwendung finden Sie bei der Beschreibung des Pragmas AUTONOMOUS TRANSACTION im Handbuch „ SQL-Sprachbeschreibung Teil 1: SQL-Anweisungen“.