Dela via


Aktivera flera aktiva resultatuppsättningar

Flera aktiva resultatuppsättningar (MARS) är en funktion som fungerar med SQL Server för att tillåta körning av flera batchar på en enda anslutning. När MARS är aktiverat för användning med SQL Server lägger varje kommandoobjekt som används till en session i anslutningen.

Kommentar

En enda MARS-session öppnar en logisk anslutning som MARS kan använda och sedan en logisk anslutning för varje aktivt kommando.

Aktivera och inaktivera MARS i Anslut ionssträngen

Kommentar

Följande anslutningssträng använder adventureworks-exempeldatabasen som ingår i SQL Server. De angivna anslutningssträng förutsätter att databasen är installerad på en server med namnet MSSQL1. Ändra anslutningssträng efter behov för din miljö.

MARS-funktionen är inaktiverad som standard. Det kan aktiveras genom att lägga till nyckelordsparet "MultipleActiveResultSets=True" i anslutningssträng. "True" är det enda giltiga värdet för att aktivera MARS. I följande exempel visas hur du ansluter till en instans av SQL Server och hur du anger att MARS ska vara aktiverat.

Dim connectionString As String = "Data Source=MSSQL1;" & _  
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _  
    "MultipleActiveResultSets=True"  
string connectionString = "Data Source=MSSQL1;" +
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=True";  

Du kan inaktivera MARS genom att lägga till nyckelordsparet "MultipleActiveResultSets=False" i anslutningssträng. "False" är det enda giltiga värdet för att inaktivera MARS. Följande anslutningssträng visar hur du inaktiverar MARS.

Dim connectionString As String = "Data Source=MSSQL1;" & _  
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _  
    "MultipleActiveResultSets=False"  
string connectionString = "Data Source=MSSQL1;" +
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=False";  

Särskilda överväganden vid användning av MARS

I allmänhet bör befintliga program inte behöva ändras för att använda en MARS-aktiverad anslutning. Men om du vill använda MARS-funktioner i dina program bör du förstå följande särskilda överväganden.

Interfoliering av instruktion

MARS-åtgärder körs synkront på servern. Instruktionsinterleaving av SELECT- och BULK INSERT-instruktioner tillåts. Instruktioner för datamanipuleringsspråk (DML) och datadefinitionsspråk (DDL) körs dock atomiskt. Alla instruktioner som försöker köra medan en atomisk batch körs blockeras. Parallell körning på servern är inte en MARS-funktion.

Om två batchar skickas under en MARS-anslutning, varav en innehåller en SELECT-instruktion, den andra innehåller en DML-instruktion, kan DML börja köras inom körningen av SELECT-instruktionen. DML-instruktionen måste dock köras för att slutföras innan SELECT-instruktionen kan göra framsteg. Om båda uttrycken körs under samma transaktion visas inte ändringar som görs av en DML-instruktion efter att SELECT-instruktionen har startat körningen för läsåtgärden.

En WAITFOR-instruktion i en SELECT-instruktion ger inte transaktionen medan den väntar, dvs. tills den första raden skapas. Detta innebär att inga andra batchar kan köras inom samma anslutning medan en WAITFOR-instruktion väntar.

MARS-sessionscache

När en anslutning öppnas med MARS aktiverat skapas en logisk session, vilket ger ytterligare omkostnader. För att minimera omkostnaderna och förbättra prestandan cachelagrar SqlClient MARS-sessionen inom en anslutning. Cachen innehåller högst 10 MARS-sessioner. Det här värdet är inte användarjusterbart. Om sessionsgränsen har nåtts skapas en ny session – ett fel genereras inte. Cachen och sessionerna som ingår i den är per anslutning. de delas inte mellan anslutningar. När en session släpps returneras den till poolen om inte poolens övre gräns har nåtts. Om cachepoolen är full stängs sessionen. MARS-sessioner upphör inte att gälla. De rensas bara när anslutningsobjektet tas bort. MARS-sessionscachen är inte förinläst. Det läses in eftersom programmet kräver fler sessioner.

Trådsäkerhet

MARS-åtgärder är inte trådsäkra.

Anslutningspooler

MARS-aktiverade anslutningar poolas som alla andra anslutningar. Om ett program öppnar två anslutningar, en med MARS aktiverat och en med MARS inaktiverad, finns de två anslutningarna i separata pooler. Mer information finns i SQL Server Anslut ion Pooling (ADO.NET).

SQL Server Batch-körningsmiljö

När en anslutning öppnas definieras en standardmiljö. Den här miljön kopieras sedan till en logisk MARS-session.

Batchkörningsmiljön innehåller följande komponenter:

  • Ange alternativ (till exempel ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Säkerhetskontext (användar-/programroll)

  • Databaskontext (aktuell databas)

  • Körningstillståndsvariabler (till exempel @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)

  • Temporära tabeller på översta nivån

Med MARS är en standardkörningsmiljö associerad med en anslutning. Varje ny batch som börjar köras under en viss anslutning tar emot en kopia av standardmiljön. När kod körs under en viss batch begränsas alla ändringar som görs i miljön till den specifika batchen. När körningen är klar kopieras körningsinställningarna till standardmiljön. Om en enda batch utfärdar flera kommandon som ska köras sekventiellt under samma transaktion är semantik samma som de som exponeras av anslutningar som involverar tidigare klienter eller servrar.

Parallell körning

MARS är inte utformat för att ta bort alla krav för flera anslutningar i ett program. Om ett program behöver verklig parallell körning av kommandon mot en server ska flera anslutningar användas.

Tänk dig till exempel följande scenario. Två kommandoobjekt skapas, ett för bearbetning av en resultatuppsättning och ett annat för att uppdatera data. de delar en gemensam anslutning via MARS. I det här scenariot är Transaction.Commit misslyckas med uppdateringen tills alla resultat har lästs på det första kommandoobjektet, vilket ger följande undantag:

Meddelande: Transaktionskontext som används av en annan session.

Källa: .NET SqlClient Data Provider

Förväntat: (null)

Mottaget: System.Data.SqlClient.SqlException

Det finns tre alternativ för att hantera det här scenariot:

  1. Starta transaktionen när läsaren har skapats, så att den inte ingår i transaktionen. Varje uppdatering blir sedan en egen transaktion.

  2. Genomför allt arbete när läsaren har stängts. Detta har potential för en betydande uppsättning uppdateringar.

  3. Använd inte MARS; använd i stället en separat anslutning för varje kommandoobjekt som du skulle ha gjort före MARS.

Identifiera MARS-stöd

Ett program kan söka efter MARS-stöd genom att läsa värdet SqlConnection.ServerVersion . Huvudnumret ska vara 9 för SQL Server 2005 och 10 för SQL Server 2008.

Se även