Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ě. 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. 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, 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 MARS, vytvoří se logická relace, což zvyšuje režii. Pokud chcete minimalizovat režii a zvýšit 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 jednotlivá připojení; nejsou sdíleny mezi připojeními. Když se relace uvolní, vrátí se do fondu, pokud není dosaženo horního limitu fondu. Pokud je fond mezipaměti plný, relace se zavře. Platnost relací MARS nikdy nevyprší. Vyčistí se pouze při odstranění objektu připojení. Mezipaměť relace MARS není předem načtena. Načítá se, protože aplikace vyžaduje více relací.
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:
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, 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: System.Data.SqlClient.SqlException
Pro zpracování tohoto scénáře existují tři možnosti:
Spusťte transakci až po vytvoření čtečky, aby nebyla její součástí. 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.