Sprache

Aktivieren mehrerer aktiver Ergebnissätze

Multiple Active Result Sets (MARS) ist eine Funktion, die mit SQL Server verwendet wird, um das Ausführen mehrerer Batches über eine einzelne Verbindung zu ermöglichen. Wenn MARS für die Verwendung mit SQL Server aktiviert wird, fügen die einzelnen verwendeten Befehlsobjekte der Verbindung eine Sitzung hinzu.

Hinweis

Eine einzelne MARS-Sitzung öffnet eine logische Verbindung, die MARS verwenden kann, und dann eine logische Verbindung für jeden aktiven Befehl.

Aktivieren und Deaktivieren von MARS in der Verbindungszeichenfolge

Hinweis

Die folgenden Verbindungszeichenfolgen verwenden die Beispieldatenbank AdventureWorks , die in SQL Server enthalten ist. Die angegebenen Verbindungszeichenfolgen setzen voraus, dass die Datenbank auf einem Server namens MSSQL1 installiert ist. Ändern Sie die Verbindungszeichenfolge nach Bedarf für Ihre Umgebung.

Die MARS-Feature ist standardmäßig deaktiviert. Es kann durch Hinzufügen des "MultipleActiveResultSets=True"-Schlüsselwortpaars zu Ihrer Verbindungszeichenfolge aktiviert werden. „True“ ist der einzige gültige Wert zum Aktivieren von MARS. Das folgende Beispiel zeigt, wie eine Verbindung mit einer Instanz von SQL Server hergestellt wird und wie angegeben wird, dass MARS aktiviert werden soll.

Dim connectionString As String = "..." & _
    "MultipleActiveResultSets=True"
string connectionString = "..." +
    "MultipleActiveResultSets=True";

Sie können MARS durch Hinzufügen des "MultipleActiveResultSets=False"-Schlüsselwortpaars zu Ihrer Verbindungszeichenfolge deaktivieren. „False“ ist der einzige gültige Wert zum Deaktivieren von MARS.

Besondere Überlegungen bei der Verwendung von MARS

Im Allgemeinen sollten bestehende Anwendungen nicht modifiziert werden müssen, um eine MARS-fähige Verbindung zu nutzen. Wenn Sie jedoch MARS-Features in Ihren Anwendungen verwenden möchten, sollten Sie mit den folgenden besonderen Aspekten vertraut sein.

Überlappen von Anweisungen

MARS-Vorgänge werden auf dem Server synchron ausgeführt. Die Verschachtelung von SELECT- und BULK INSERT-Anweisungen ist zulässig. DML- (Data Manipulation Language) und DDL-Anweisungen (Data Definition Language) werden jedoch atomisch ausgeführt. Alle Anweisungen, die versuchen, während der Ausführung eines atomischen Batches ausgeführt zu werden, werden blockiert. Die parallele Ausführung auf dem Server ist kein MARS-Feature.

Wenn zwei Batches über eine MARS-Verbindung übermittelt werden, von denen einer eine SELECT-Anweisung und der andere eine DML-Anweisung enthält, kann DML mit der Ausführung innerhalb der Ausführung der SELECT-Anweisung beginnen. Die DML-Anweisung muss jedoch bis zum Abschluss ausgeführt werden, bevor die SELECT Anweisung Fortschritte erzielen kann. Wenn beide Anweisungen unter derselben Transaktion ausgeführt werden, sind alle Änderungen, die von einer DML-Anweisung vorgenommen wurden, nachdem die Ausführung der SELECT-Anweisung begonnen hat, für den Lesevorgang nicht sichtbar.

Eine WAITFOR-Anweisung innerhalb einer SELECT-Anweisung hält die Transaktion nicht an, während sie wartet, d. h. bis die erste Zeile erzeugt wird. Dies bedeutet, dass keine anderen Batches innerhalb derselben Verbindung ausgeführt werden können, während auf eine WAITFOR-Anweisung gewartet wird.

MARS-Sitzungscache

Wenn sich eine Verbindung mit aktiviertem MARS öffnet, erstellt der Anbieter eine logische Sitzung, was Aufwand bedeutet. Um diesen Aufwand zu reduzieren, speichert SqlClient bis zu 10 MARS-Sitzungen pro Verbindung zwischen. Der Grenzwert ist nicht anpassbar. Wenn der Grenzwert erreicht ist, erstellt der Anbieter eine neue Sitzung, ohne einen Fehler auszulösen. Der Cache und die zugehörigen Sitzungen werden nicht über Verbindungen hinweg freigegeben. Nach der Verwendung wird eine Sitzung an den Cache zurückgegeben, es sei denn, der Cache ist voll; in diesem Fall schließt der Anbieter sie. Zwischengespeicherte Sessions laufen nicht ab; der Anbieter bereinigt sie, wenn Sie die Verbindung freigeben. Der Anbieter füllt den Cache auf, wenn die Anwendung Sitzungen benötigt.

Threadsicherheit

MARS-Vorgänge sind nicht threadsicher.

Verbindungspooling

MARS-fähige Verbindungen lassen sich wie andere Verbindungen in einem Pool zusammenfassen. Wenn eine Anwendung zwei Verbindungen öffnet, eine mit aktiviertem und eine mit deaktiviertem MARS, befinden sich die beiden Verbindungen in getrennten Pools. Weitere Informationen finden Sie unter SQL Server-Verbindungspooling (ADO.NET).

SQL Server-Batchausführungsumgebung

Beim Öffnen einer Verbindung wird eine Standardumgebung definiert. Diese Umgebung wird dann in eine logische MARS-Sitzung kopiert.

Die Batchausführungsumgebung umfasst die folgenden Komponenten:

  • Festlegen von Optionen (z. B. ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Sicherheitskontext (Benutzer/Anwendungsrolle)

  • Datenbankkontext (aktuelle Datenbank)

  • Ausführungszustandsvariablen (z. B @@ERROR. , @@ROWCOUNT, @@FETCH_STATUS@@IDENTITY)

  • Temporäre Tabellen der obersten Ebene

Bei MARS ist einer Verbindung eine Standardausführungsumgebung zugeordnet. Jeder neue Batch, dessen Ausführung unter einer bestimmten Verbindung gestartet wird, erhält eine Kopie der Standardumgebung. Bei Ausführung von Code in einem bestimmten Batch sind sämtliche an der Umgebung vorgenommenen Änderungen auf diesen speziellen Batch begrenzt. Beim Abschluss der Ausführung werden die Ausführungseinstellungen in die Standardumgebung kopiert. Bei einem einzelnen Batch, der mehrere Befehle enthält, die nacheinander in derselben Transaktion ausgeführt werden sollen, ist die Semantik die gleiche wie bei Verbindungen, die von früheren Clients oder Servern verfügbar gemacht werden.

Parallelausführung

MARS ist nicht so konzipiert, dass alle Anforderungen für mehrere Verbindungen in einer Anwendung entfallen. Wenn eine Anwendung eine tatsächliche parallele Ausführung von Befehlen auf einem Server benötigt, müssen mehrere Verbindungen verwendet werden.

Betrachten Sie zum Beispiel das folgende Szenario. Es werden zwei Befehlsobjekte erstellt: eines zur Verarbeitung eines Resultsets und ein weiteres zur Aktualisierung von Daten. Beide nutzen eine gemeinsame Verbindung über MARS. In diesem Szenario kann Transaction. Commit schlägt bei der Aktualisierung fehl, bis alle Ergebnisse des ersten Befehlsobjekts gelesen wurden, was zu der folgenden Ausnahme führt:

Meldung: Der Transaktionskontext wird von einer anderen Sitzung verwendet.

Quelle: .Net SqlClient-Datenanbieter

Erwartet: (null)

Empfangen: Microsoft.Data.SqlClient.SqlException

Es gibt zwei Optionen zum Umgang mit diesem Szenario:

  1. Starten Sie die Transaktion nach Erstellen des Readers so, dass sie nicht Teil der Transaktion ist. Jede Aktualisierung wird dann eine eigene Transaktion.

  2. Führen Sie alle Änderungen nach dem Schließen des Readers durch. Dies birgt das Potenzial für einen beträchtlichen Batch von Aktualisierungen.

  3. Verwenden Sie nicht MARS sondern für jedes Befehlsobjekt eine separate Verbindung, so wie Sie es vor MARS getan hätten.

Ermitteln der MARS-Unterstützung

Eine Anwendung kann auf MARS-Unterstützung prüfen, indem sie den Wert SqlConnection.ServerVersion liest. Die Hauptnummer muss 9 für SQL Server 2005 und 10 für SQL Server 2008 lauten.

Siehe auch