Povolení více aktivních sad výsledků
Několik aktivních sad výsledků (MARS) je funkce, která funguje s SQL Serverem a umožňuje spouštění více dávek na jednom připojení. Pokud je u SQL Serveru povolená funkce MARS, každý objekt příkazu, který se používá, přidá do připojení relaci.
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ězec používají ukázkovou databázi AdventureWorks, která je součástí SQL Serveru. Zadané připojovací řetězec 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. "Pravda" je jediná platná hodnota pro povolení 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í řetězec. "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ě. Je povoleno prokládání příkazů SELECT a BULK INSERT. Příkazy jazyka DML (Data Manipulat Language) a DDL (Data Definition Language) se ale provádějí atomicky. Všechny příkazy, které se pokouší 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, jeden z nich obsahuje příkaz SELECT, druhý obsahující příkaz DML, DML může zahájit provádění v rámci provádění příkazu SELECT. Příkaz DML se ale musí spustit k dokončení, aby příkaz SELECT mohl postupovat. Pokud jsou oba příkazy spuštěny pod stejnou transakcí, všechny změny provedené příkazem DML po spuštění příkazu SELECT nejsou viditelné pro operaci čtení.
Příkaz WAITFOR uvnitř příkazu SELECT negeneruje transakci při čekání, tj. dokud se nevygeneruje první řádek. To znamená, že během čekání příkazu WAITFOR se nespustí žádné jiné dávky ve stejném připojení.
Mezipaměť relací MARS
Když se otevře připojení s povoleným marsem, vytvoří se logická relace, která přidá další režii. Aby se minimalizovala režie a zvýšil výkon, SqlClient ukládá relaci MARS do mezipaměti v rámci připojení. Mezipaměť obsahuje maximálně 10 relací MARS. Tato hodnota není možné upravit uživatelem. Pokud dosáhnete limitu relace, vytvoří se nová relace – negeneruje se chyba. Mezipaměť a relace obsažené v ní jsou pro připojení; nejsou sdíleny mezi připojeními. Když se relace uvolní, vrátí se do fondu, pokud nedosáhnete horního limitu fondu. Pokud je fond mezipaměti plný, relace se zavře. Nevyprší platnost relací MARS. Vyčistí se pouze při odstranění objektu připojení. Mezipaměť relace MARS není předem načtena. Načte se, protože aplikace vyžaduje více relací.
Bezpečný přístup z více vláken
Operace MARS nejsou bezpečné pro přístup z více vláken.
Sdružování připojení
Připojení s podporou MARS jsou ve fondu jako jakékoli jiné připojení. Pokud aplikace otevře dvě připojení, jedno s povoleným marsem a jedno se zakázaným marsem, 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 pak zkopíruje do logické relace MARS.
Prostředí dávkového spouštění zahrnuje následující komponenty:
Nastavení možností (například ANSI_NULLS, DATE_FORMAT, JAZYK, TEXTYIZE)
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, dokud se nečte 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
Byl očekáváno: (null)
Přijato: System.Data.SqlClient.SqlException
Pro zpracování tohoto scénáře existují tři možnosti:
Spusťte transakci po vytvoření čtečky, takže není součástí transakce. Každá aktualizace se pak stane vlastní transakcí.
Po zavření čtečky potvrďte veškerou práci. To má potenciál pro podstatnou dávku aktualizací.
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.