Freigeben über


Steuern von Transaktionen (Datenbankmodul)

Transaktionen werden von Anwendungen hauptsächlich durch Angeben der Zeitpunkte für Transaktionsbeginn und -ende gesteuert. Dies kann durch Angeben von Transact-SQL-Anweisungen oder durch Datenbank-API-Funktionen erfolgen. Das System muss auch in der Lage sein, Fehler richtig zu behandeln, die eine Transaktion vor deren Abschluss beenden.

Standardmäßig werden Transaktionen auf der Verbindungsebene verwaltet. Wenn eine Transaktion über eine Verbindung gestartet wird, sind alle Transact-SQL-Anweisungen, die über diese Verbindung ausgeführt werden, Teil der Transaktion, bis diese endet. In einer MARS-Sitzung (Multiple Active Result Set) wird eine explizite oder implizite Transact-SQL-Transaktion jedoch zu einer Transaktion mit Batchbereich, die auf der Batchebene verwaltet wird. Wenn der Batch abgeschlossen wird, führt SQL Server automatisch einen Rollback aus, wenn für die Transaktion mit Batchbereich kein Commit oder Rollback ausgeführt wurde.

Starten von Transaktionen

Mithilfe von API-Funktionen und Transact-SQL-Anweisungen können Sie Transaktionen in einer Instanz des SQL Server Database Engine (Datenbankmodul) als explizite, implizite oder Autocommit-Transaktionen starten. In einer MARS-Sitzung werden explizite und implizite Transact-SQL-Transaktionen zu Transaktionen mit Batchbereich.

  • Explizite Transaktionen
    Starten Sie eine Transaktion explizit mithilfe einer API-Funktion oder durch Ausgeben einer BEGIN TRANSACTION-Transact-SQL-Anweisung.

  • Autocommit-Transaktionen
    Der Standardmodus für das Database Engine (Datenbankmodul). Für jede einzelne Transact-SQL-Anweisung wird nach Abschluss ein Commit ausgeführt. Es ist nicht notwendig, Anweisungen zum Steuern von Transaktionen anzugeben.

  • Implizite Transaktionen
    Sie legen den impliziten Transaktionsmodus entweder durch eine API-Funktion oder durch die Transact-SQL-Anweisung SET IMPLICIT_TRANSACTIONS ON fest. Die nächste Anweisung startet automatisch eine neue Transaktion. Wenn diese Transaktion abgeschlossen ist, startet die nächste Transact-SQL-Anweisung eine neue Transaktion.

  • Transaktionen mit Batchbereich
    Ausschließlich für MARS (Multiple Active Result Sets) gilt: Eine explizite oder implizite Transact-SQL-Transaktion, die im Rahmen einer MARS-Sitzung gestartet wird, wird zu einer Transaktion mit Batchbereich. Für eine Transaktion mit Batchbereich, für die beim Abschluss eines Batches kein Commit oder Rollback ausgeführt wurde, führt SQL Server automatisch ein Rollback aus.

Die Transaktionsmodi werden auf der Verbindungsebene verwaltet. Wenn eine Verbindung von einem Transaktionsmodus zum anderen wechselt, hat dies keine Auswirkung auf die Transaktionsmodi anderer Verbindungen.

Beenden von Transaktionen

Sie können Transaktionen entweder mit einer COMMIT- oder ROLLBACK-Anweisung oder durch eine API-Funktion beenden.

  • COMMIT
    Wenn eine Transaktion erfolgreich ist, führen Sie einen Commit aus. Durch eine COMMIT-Anweisung wird sichergestellt, dass alle Änderungen der Transaktion zum dauerhaften Bestandteil der Datenbank werden. Durch eine COMMIT-Anweisung werden auch von der Transaktion verwendete Ressourcen, wie etwa Sperren, freigegeben.

  • ROLLBACK
    Wenn ein Fehler in einer Transaktion auftritt, oder wenn ein Benutzer beschließt, die Transaktion abzubrechen, führen Sie ein Rollback aus. Durch eine ROLLBACK-Anweisung werden alle Änderungen, die während der Transaktion vorgenommen wurden, rückgängig gemacht, sodass die Daten in ihren Ausgangsstatus zurückversetzt werden. Durch das ROLLBACK werden auch Ressourcen freigegeben, die von der Transaktion beansprucht wurden.

HinweisHinweis

Bei Verbindungen, die für die Unterstützung von MARS (Multiple Active Result Sets) aktiviert sind, kann für eine durch eine API-Funktion gestartete explizite Transaktion kein Commit ausgeführt werden, solange Ausführungsanforderungen anstehen. Jeder Versuch, ein Commit für eine derartige Transaktion auszuführen, für die noch ausstehende Vorgänge vorhanden sind, führt zu einem Fehler.

Angeben der Transaktionsgrenzen

Sie können den Beginn und das Ende von Database Engine (Datenbankmodul)-Transaktionen durch Transact-SQL-Anweisungen oder API-Funktionen und -Methoden kennzeichnen.

  • Transact-SQL-Anweisungen
    Verwenden Sie die Anweisungen BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK und SET IMPLICIT_TRANSACTIONS, um Transaktionen zu kennzeichnen. Diese Anweisungen werden in erster Linie in DB-Library-Anwendungen sowie in Transact-SQL-Skripts verwendet, wie etwa den Skripts, die mithilfe des Befehlszeilen-Dienstprogramms oosql ausgeführt werden.

  • API-Funktionen und -Methoden
    Datenbank-APIs wie etwa ODBC, OLE DB, ADO und der .NET Framework SQLClient-Namespace enthalten Funktionen oder Methoden, die zur Kennzeichnung von Transaktionen verwendet werden. Es handelt sich dabei um die Mechanismen, die vorrangig für die Steuerung von Transaktionen in einer Database Engine (Datenbankmodul)-Anwendung verwendet werden.

Jede einzelne Transaktion darf nur mit einer dieser Methoden verwaltet werden. Das Verwenden beider Methoden für dieselbe Transaktion kann zu nicht definierten Ergebnissen führen. So empfiehlt es sich beispielsweise nicht, eine Transaktion mithilfe der API-Funktionen von ODBC zu starten und anschließend die COMMIT-Anweisung von Transact-SQL zum Beenden der Transaktion zu verwenden. Der SQL Server-ODBC-Treiber wird dann nicht benachrichtigt, dass für die Transaktion ein Commit ausgeführt wurde. Verwenden Sie in diesem Fall die SQLEndTran-Funktion von ODBC, um die Transaktion zu beenden.

Fehler während der Transaktionsverarbeitung

Wenn eine Transaktion aufgrund eines Fehlers nicht erfolgreich beendet werden kann, führt SQL Server automatisch ein Rollback für die Transaktion aus und gibt alle Ressourcen frei, die von der Transaktion beansprucht wurden. Wenn die Netzwerkverbindung des Clients mit einer Instanz des Database Engine (Datenbankmodul) unterbrochen ist, wird für alle ausstehenden Transaktionen dieser Verbindung ein Rollback ausgeführt, sobald das Netzwerk die Instanz über die Unterbrechung benachrichtigt. Wenn die Clientanwendung einen Fehler erzeugt oder wenn der Clientcomputer heruntergefahren oder neu gestartet wird, kommt es ebenfalls zu einer Unterbrechung der Verbindung, und die Instanz des Database Engine (Datenbankmodul) führt ein Rollback für alle ausstehenden Verbindungen aus, sobald das Netzwerk es über die Unterbrechung benachrichtigt. Wenn sich der Client von der Anwendung abmeldet, wird für alle ausstehenden Transaktionen ein Rollback ausgeführt.

Wenn ein Anweisungsfehler zur Laufzeit (wie etwa eine Einschränkungsverletzung) in einem Batch auftritt, führt das Database Engine (Datenbankmodul) standardmäßig nur für die Anweisung ein Rollback aus, die den Fehler generiert hat. Sie können dieses Verhalten mithilfe der SET XACT_ABORT-Anweisung ändern. Nach dem Ausführen von SET XACT_ABORT ON führt jeder Anweisungsfehler zur Laufzeit dazu, dass automatisch ein Rollback für die aktuelle Transaktion ausgeführt wird. Kompilierungsfehler, wie z. B. Syntaxfehler, sind von SET XACT_ABORT nicht betroffen. Weitere Informationen finden Sie unter SET XACT_ABORT (Transact-SQL).

Für den Fall, dass Fehler auftreten, sollte in den Anwendungscode eine korrigierende Aktion (COMMIT oder ROLLBACK) aufgenommen werden. Ein effizientes Tool zur Fehlerbehandlung u. a. bei Fehlern in Transaktionen ist die Transact-SQL-TRY…CATCH-Konstruktion. Weitere Informationen sowie auf Transaktionen zutreffende Beispiele zu dieser Konstruktion finden Sie unter Verwenden von TRY...CATCH in Transact-SQL und TRY...CATCH (Transact-SQL).