Freigeben über


Verteilte Abfragen und verteilte Transaktionen

Das SQL Server Database Engine (Datenbankmodul) ermöglicht, Links mit OLE DB-Datenquellen, so genannten Verbindungsservern, zu erstellen. Nach dem Herstellen eines Links mit einer OLE DB-Datenquelle haben Sie folgende Möglichkeiten:

Sie können in Transact-SQL-Anweisungen auf Rowsets aus den OLE DB-Datenquellen als Tabellen verweisen.

  • Sie können Befehle an die OLE DB-Datenquellen übergeben und die resultierenden Rowsets als Tabellen in Transact-SQL-Anweisungen einbinden.

Jede verteilte Abfrage kann auf mehrere Verbindungsserver verweisen und Update- oder Lesevorgänge auf jedem einzelnen Verbindungsserver ausführen. Eine einzelne verteilte Abfrage kann Lesevorgänge auf bestimmten Verbindungsservern und Updatevorgänge auf anderen Verbindungsservern ausführen. Im Allgemeinen benötigt Database Engine (Datenbankmodul) Unterstützung für verteilte Transaktionen vom entsprechenden OLE DB-Anbieter, wenn es wahrscheinlich ist, dass Daten von mehr als einem Verbindungsserver in einer Transaktion aktualisiert werden. Somit hängen die Abfragetypen, die auf den Verbindungsservern unterstützt werden, davon ab, welches Maß an Unterstützung für Transaktionen von den OLE DB-Anbietern bereitgestellt wird. OLE DB definiert zwei optionale Schnittstellen für die Transaktionsverwaltung:

  • ITransactionLocal unterstützt lokale Transaktionen in der OLE DB-Datenquelle.

  • Bei ITransactionJoin kann der Anbieter an einer verteilten Transaktion teilnehmen, die andere Ressourcen-Manager einschließt.

    Jeder Anbieter, der ITransactionJoin unterstützt, unterstützt auch ITransactionLocal.

Wenn eine verteilte Abfrage ausgeführt wird, während sich die Verbindung im Autocommitmodus befindet, gelten die folgenden Regeln:

  • Auf Anbietern, die ITransactionLocal nicht unterstützen, sind nur Lesevorgänge zulässig.

  • Auf Anbietern, die ITransactionLocal unterstützen, sind alle Updatevorgänge zulässig.

    Die steuernde Instanz von Database Engine (Datenbankmodul) ruft ITransactionJoin automatisch auf jedem Verbindungsserver auf, der an einem Updatevorgang beteiligt ist, um eine lokale Transaktion zu starten. Wenn die Anweisung erfolgreich ist, wird ein Commit ausgeführt, wenn die Anweisung einen Fehler erzeugt, wird ein Rollback ausgeführt.

Wird eine verteilte Abfrage in einer verteilten partitionierten Sicht ausgeführt oder wird sie ausgeführt, wenn sich die Verbindung entweder in einer expliziten oder impliziten Transaktion befindet, gelten folgende Regeln:

  • Auf Anbietern, die ITransactionJoin nicht unterstützen, sind nur Lesevorgänge zulässig. Anbieter, die keine Transaktionen unterstützen, oder die nur ITransactionLocal unterstützen, können nicht an Updatevorgängen teilnehmen.

  • Wenn SET XACT_ABORT auf ON festgelegt ist, sind auf allen Anbietern, die ITransactionJoin unterstützen, alle Updatevorgänge zulässig. Die steuernde Instanz von Database Engine (Datenbankmodul) ruft ITransactionJoin automatisch in jedem Verbindungsserver auf, der an einem Updatevorgang beteiligt ist, um den Server als Teilnehmer in der verteilten Transaktion zu registrieren. Microsoft Distributed Transaction Coordinator (MS DTC) führt dann einen Commit oder Rollback für sie aus, wenn der steuernde Server anzeigt, dass für die Transaktion entweder ein Commit oder Rollback ausgeführt wird.

  • Wenn SET XACT_ABORT auf OFF festgelegt ist, muss der Verbindungsserver auch geschachtelte Transaktionen unterstützen, damit Updatevorgänge zugelassen werden. Geschachtelte Transaktionen werden unterstützt, wenn der Anbieter das Aufrufen von ITransactionLocal::StartTransaction während einer vorhandenen Transaktion für die Sitzung unterstützt. Dadurch kann SQL Server für einzelne Anweisungen in verteilten Abfragen einen Rollback ausführen, ohne für die gesamte Transaktion einen Rollback ausführen zu müssen.

Aus den oben aufgeführten Regeln ergibt sich die folgende Einschränkung für Anbieter, die keine geschachtelten Transaktionen unterstützen: in verteilten Transaktionen sind Updatevorgänge nur zulässig, wenn die XACT_ABORT-Option auf ON festgelegt ist.

Siehe auch

Konzepte