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, 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ězce používají ukázkovou databázi AdventureWorks , která je součástí SQL Serveru. Uvedené připojovací řetězce předpokládají, že databáze je nainstalována na serveru s názvem MSSQL1. Podle potřeby upravte připojovací řetězec pro vaše prostředí.
Funkce MARS je ve výchozím nastavení zakázaná. Můžete ho povolit tak, že do připojovacího řetězce přidáte dvojici klíčových slov MultipleActiveResultSets=True. "True" 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.
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
Mars můžete zakázat přidáním páru klíčových slov MultipleActiveResultSets=False do připojovacího řetězce. "False" je jediná platná hodnota pro zakázání MARS. Následující připojovací řetězec ukazuje, jak zakázat MARS.
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=False";
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 stří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 pokusí spustit během provádění atomické dávky, 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 povolenou funkcí MARS, vytvoří se logická relace, což představuje 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 je dosaženo limitu relací, vytvoří se nová relace – chyba se nevygeneruje. Mezipaměť a relace, které obsahuje, jsou vázány na jednotlivá připojení; nejsou sdíleny mezi připojeními. Po uvolnění relace se vrátí do poolu, pokud již nebylo dosaženo horního limitu poolu. Pokud je fond mezipaměti plný, relace bude ukončena. Platnost relací MARS 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ákna
Operace MARS nejsou bezpečné z hlediska vláken.
Sdružování připojení
Připojení s podporou MARS jsou sdružována do fondu 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 tato dvě připojení v oddělených fondech připojení.
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, 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ě jediné dávky, která vydává několik příkazů k postupnému provedení v rámci téže transakce, je sémantika stejná jako u připojení používaných staršími klienty nebo servery.
Paralelní spouš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í scénář. 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 při aktualizaci selže, dokud nejsou přečteny všechny výsledky z prvního objektu příkazu, a vyvolá následující výjimku:
Zpráva: Kontext transakce, který se používá v jiné relaci.
Zdroj: Zprostředkovatel dat Microsoft SqlClient
Očekáváno: (null)
Přijato: Microsoft.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 čtečka nebyla součástí transakce. Každá aktualizace se pak stane vlastní transakcí.
Po zavření čtečky uložte všechny změny. 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.
Detekce 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.