Share via


Verteilte Transact-SQL-Transaktionen

Die in Transact-SQL gestarteten verteilten Transaktionen weisen eine relativ einfache Struktur auf:

  1. Ein Transact-SQL-Skript oder eine -Anwendungsverbindung führt eine Transact-SQL-Anweisung aus, die eine verteilte Transaktion startet.

  2. Die Instanz von SQL Server Database Engine (Datenbankmodul), die die Anweisung ausführt, wird zum steuernden Server der Transaktion.

  3. Das Skript oder die Anweisung führt dann entweder verteilte Abfragen auf Verbindungsservern oder remote gespeicherte Prozeduren auf Remoteservern aus.

  4. Während der verteilten Abfragen und Remoteprozeduraufrufe ruft der steuernde Server automatisch Microsoft DTC (Distributed Transaction Coordinator) auf, um die Verbindungs- und Remoteserver als Teilnehmer an der verteilten Transaktion einzutragen.

  5. Wenn das Skript oder die Anwendung entweder eine COMMIT- oder eine ROLLBACK-Anweisung ausgibt, ruft die steuernde Instanz von SQL Server MS DTC auf, um den Vorgang des Zweiphasencommits zu verwalten oder um die Verbindungs- und Remoteserver zu benachrichtigen, damit sie für ihre Transaktionen einen Rollback ausführen.

Erforderliche Transact-SQL-Anweisungen

Es gibt nur wenige Transact-SQL-Anweisungen, die die verteilten Transaktionen steuern, da die meiste Arbeit von SQL Server Database Engine (Datenbankmodul) und MS DTC intern ausgeführt wird. Die einzigen Transact-SQL-Anweisungen, die im Transact-SQL-Skript oder in der -Anwendung notwendig sind, sind diejenigen, die die nachstehenden Aufgaben erfüllen:

  • Starten einer verteilten Transaktion.

  • Ausführen von verteilten Abfragen auf Verbindungsservern oder von Remoteprozeduraufrufen auf Remoteservern.

  • Aufrufen der Transact-SQL-Standardanweisungen COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION oder ROLLBACK WORK, um die Transaktion abzuschließen.

    Bei jeder verteilten Transact-SQL-Transaktion ruft die Instanz von Database Engine (Datenbankmodul), die das Transact-SQL-Skript oder die -Verbindung verarbeitet, automatisch MS DTC auf, um die Ausführung des Commits oder des Rollbacks für die Transaktion zu koordinieren.

Starten von verteilten Transaktionen

Sie können verteilte Transaktionen in Transact-SQL auf folgende Arten starten:

  • Starten Sie eine explizite verteilte Transaktion mithilfe der BEGIN DISTRIBUTED TRANSACTION-Anweisung.

    Sie können auch eine verteilte Abfrage auf einem Verbindungsserver ausführen. Die Instanz von Database Engine (Datenbankmodul), mit der Sie eine Verbindung hergestellt haben, ruft MS DTC auf, um die verteilte Transaktion zusammen mit dem Verbindungsserver zu verwalten. Sie können auch remote gespeicherte Prozeduren für eine Remoteinstanz von Database Engine (Datenbankmodul) als Teil der verteilten Transaktion aufrufen.

  • Führen Sie in einer lokalen Transaktion eine verteilte Abfrage aus.

    Wenn die OLE DB-Datenquelle die ITransactionJoin-Schnittstelle unterstützt, wird die Transaktion zu einer verteilten Transaktion heraufgestuft, selbst wenn es sich bei der Abfrage um eine Nur-Lese-Abfrage handelt. Wenn die Datenquelle ITransactionJoin nicht unterstützt, sind ausschließlich Nur-Lese-Anweisungen zulässig.

  • Wenn SET REMOTE_PROC_TRANSACTIONS ON ausgeführt wurde und eine lokale Transaktion eine remote gespeicherte Prozedur für eine andere Instanz von Database Engine (Datenbankmodul) aufruft, wird die lokale Transaktion zu einer verteilten Transaktion heraufgestuft.

    Database Engine (Datenbankmodul) verwendet MS DTC zur Koordinierung der Transaktion mit dem Remoteserver. Aufrufe remote gespeicherter Prozeduren werden außerhalb des Bereichs einer lokalen Transaktion ausgeführt, wenn REMOTE_PROC_TRANSACTIONS auf OFF festgelegt ist. Für von der Remoteprozedur ausgeführte Arbeiten wird kein Rollback ausgeführt, wenn für die lokale Transaktion ein Rollback ausgeführt wird. Für Arbeiten der remote gespeicherten Prozedur wird am Ende der Prozedur ein Commit ausgeführt, und nicht zu dem Zeitpunkt, zu dem für die lokale Transaktion ein Commit ausgeführt wird.

Die Option REMOTE_PROC_TRANSACTIONS ist eine Kompatibilitätsoption, die sich nur auf Aufrufe von remote gespeicherten Prozeduren auswirkt, die für mithilfe von sp_addserver definierte Remoteserver ausgeführt werden. Die Option gilt nicht für verteilte Abfragen, die eine gespeicherte Prozedur auf einem mit sp_addlinkedserver definierten Verbindungsserver ausführen. Weitere Informationen zu verteilten Abfragen finden Sie unter Verteilte Abfragen.