Jazyk

Povolení více aktivních sad výsledků

Několik aktivních sad výsledků (MARS) je funkce spolupracující s SQL Serverem, která umožňuje vykonání několika úloh v rámci jednoho připojení. Pokud je u SQL Serveru povolena funkce MARS, každý objekt příkazu, který se používá, vytvoří relaci v rámci připojení.

Poznámka:

Jedna relace MARS otevře jedno logické připojení, které má MARS použít, a pak jedno logické připojení pro každý aktivní příkaz.

Povolení a zakázání MARS v připojovacím řetězci

Poznámka:

Následující připojovací řetězce používají ukázkovou AdventureWorks databázi, která je součástí SQL Serveru. Zadané připojovací řetězce předpokládají, že je databáze nainstalovaná na serveru s názvem MSSQL1. Upravte připojovací řetězec podle potřeby pro vaše prostředí.

Funkce MARS je ve výchozím nastavení zakázaná. Můžete ho povolit tak, že do připojovací řetězec přidáte dvojici "MultipleActiveResultSets=True" klíčových slov. "True" je jediná platná hodnota pro aktivaci MARS. Následující příklad ukazuje, jak se připojit k instanci SQL Serveru a jak určit, že mars má být povolen.

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

Mars můžete zakázat přidáním páru "MultipleActiveResultSets=False" klíčových slov do připojovacího řetězce. "False" je jediná platná hodnota pro zakázání MARS.

Zvláštní aspekty při používání MARS

Obecně platí, že stávající aplikace by neměly potřebovat úpravy pro použití připojení s podporou MARS. Pokud ale chcete ve svých aplikacích používat funkce MARS, měli byste pochopit následující zvláštní aspekty.

Prokládání příkazů

Operace MARS se na serveru provádějí synchronně. Prokládání příkazů SELECT a BULK INSERT je povoleno. Příkazy jazyka DML (Data Manipulat Language) a DDL (Data Definition Language) se ale provádějí atomicky. Jakékoli příkazy, které se pokoušejí provést, když se provádí atomická dávka, jsou blokovány. Paralelní spouštění na serveru není funkcí MARS.

Pokud jsou pod připojením MARS odeslány dvě dávky, jedna z nich obsahuje SELECT příkaz, druhá obsahuje příkaz DML, DML může zahájit provádění v rámci provádění SELECT příkazu. Příkaz DML ale musí doběhnout do konce, než příkaz SELECT může pokračovat. Pokud jsou oba příkazy spuštěny pod stejnou transakcí, všechny změny provedené příkazem DML poté, co se příkaz SELECT začal vykonávat, nejsou pro operaci čtení viditelné.

Příkaz WAITFOR uvnitř příkazu SELECT neuvolní transakci během čekání, tj. dokud se nevygeneruje první řádek. To znamená, že zatímco příkaz WAITFOR čeká, nelze ve stejném připojení spustit žádné jiné dávky.

Mezipaměť relací MARS

Když se připojení otevře s povolenou funkcí MARS, poskytovatel vytvoří logickou relaci, která zvyšuje režii. Pokud chcete snížit režii, SqlClient ukládá do mezipaměti až 10 relací MARS na připojení. Limit není možné upravit uživatelem. Pokud je limit dosažen, poskytovatel vytvoří novou relaci bez chyby. Mezipaměť a její relace se mezi připojeními nesdílí. Po použití se relace vrátí do mezipaměti, pokud není mezipaměť plná; v opačném případě ji poskytovatel zavře. Platnost relací uložených v mezipaměti nevyprší; poskytovatel je vyčistí, když uvolníte připojení. Zprostředkovatel naplní mezipaměť, jakmile aplikace potřebuje relace.

Bezpečnost vláken

Operace MARS nejsou vláknově bezpečné.

Sdružování připojení

Připojení umožňující MARS jsou shromažďována stejně jako jakákoli jiná připojení. Pokud aplikace otevře dvě připojení, jedno s povoleným MARS a jedno se zakázaným MARS, jsou dvě připojení v samostatných fondech. Další informace najdete v tématu Sdružování připojení k SQL Serveru (ADO.NET).

Prostředí dávkového spouštění SQL Serveru

Při otevření připojení se definuje výchozí prostředí. Toto prostředí se poté zkopíruje do logické relace MARS.

Prostředí dávkového spouštění zahrnuje následující komponenty:

  • Nastavit možnosti (například ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Kontext zabezpečení (role uživatele nebo aplikace)

  • Kontext databáze (aktuální databáze)

  • Proměnné stavu provádění (například @@ERROR, @@ROWCOUNT, @@FETCH_STATUS@@IDENTITY)

  • Dočasné tabulky nejvyšší úrovně

S MARS je k připojení přidruženo výchozí spouštěcí prostředí. Každá nová dávka, která se spustí pod daným připojením, obdrží kopii výchozího prostředí. Při každém spuštění kódu v dané dávce jsou všechny změny provedené v prostředí vymezeny na konkrétní dávku. Po dokončení provádění se nastavení spuštění zkopíruje do výchozího prostředí. V případě jedné dávky vydávající několik příkazů, které se mají sekvenčně spouštět pod stejnou transakcí, jsou sémantika stejná jako ty, které jsou vystaveny připojeními zahrnujícími dřívější klienty nebo servery.

Paralelní spuštění

Mars není navržený tak, aby odebral všechny požadavky na více připojení v aplikaci. Pokud aplikace potřebuje skutečné paralelní spouštění příkazů na serveru, mělo by se použít více připojení.

Představte si například následující příklady: Vytvoří se dva objekty příkazů, jeden pro zpracování sady výsledků a druhý pro aktualizaci dat; sdílejí společné připojení přes MARS. V tomto scénáři Transaction. Commit selže při aktualizaci, když nejsou přečteny všechny výsledky u prvního objektu příkazu, a tím dojde k následující výjimce:

Zpráva: Kontext transakce, který se používá v jiné relaci.

Zdroj: Zprostředkovatel dat .NET SqlClient

Bylo očekáváno: (null)

Přijato: Microsoft.Data.SqlClient.SqlException

Pro zpracování tohoto scénáře existují tři možnosti:

  1. Spusťte transakci až po vytvoření čtečky, aby nebyla její součástí. Každá aktualizace se pak stane vlastní transakcí.

  2. Po zavření čtečky potvrďte veškerou práci. To má potenciál pro podstatnou dávku aktualizací.

  3. Nepoužívejte MARS; místo toho pro každý objekt příkazu použijte samostatné připojení, které byste měli před MARS.

Zjišťování podpory MARS

Aplikace může zkontrolovat podporu MARS načtením SqlConnection.ServerVersion hodnoty. Hlavní číslo by mělo být 9 pro SQL Server 2005 a 10 pro SQL Server 2008.

Viz také