Több aktív eredményhalmaz engedélyezése
A több aktív eredményhalmaz (MARS) az SQL Serverrel együttműködve lehetővé teszi több köteg végrehajtását egyetlen kapcsolaton. Ha a MARS engedélyezve van az SQL Serverrel való használatra, minden használt parancsobjektum hozzáad egy munkamenetet a kapcsolathoz.
Feljegyzés
Egyetlen MARS-munkamenet egy logikai kapcsolatot nyit meg a MARS számára, majd egy logikai kapcsolatot minden egyes aktív parancshoz.
A MARS engedélyezése és letiltása a kapcsolati sztringben
Feljegyzés
Az alábbi kapcsolati sztring az SQL Serverhez mellékelt AdventureWorks-mintaadatbázist használják. A megadott kapcsolati sztring feltételezik, hogy az adatbázis egy MSSQL1 nevű kiszolgálón van telepítve. Szükség szerint módosítsa a kapcsolati sztring a környezethez.
A MARS szolgáltatás alapértelmezés szerint le van tiltva. Ezt úgy engedélyezheti, hogy hozzáadja a kulcsszópárt a "MultipleActiveResultSets=True"
kapcsolati sztring. A "True" az egyetlen érvényes érték a MARS engedélyezéséhez. Az alábbi példa bemutatja, hogyan csatlakozhat az SQL Server egy példányához, és hogyan adhatja meg, hogy a MARS engedélyezve legyen.
Dim connectionString As String = "..." & _
"MultipleActiveResultSets=True"
string connectionString = "..." +
"MultipleActiveResultSets=True";
A MARS letiltásához adja hozzá a kulcsszópárt a "MultipleActiveResultSets=False"
kapcsolati sztring. A "False" az egyetlen érvényes érték a MARS letiltására.
Speciális szempontok a MARS használatakor
A MARS-kompatibilis kapcsolat használatához a meglévő alkalmazásoknak általában nincs szükségük módosításra. Ha azonban MARS-funkciókat szeretne használni az alkalmazásaiban, az alábbi speciális szempontokat kell ismernie.
Utasításközvetítés
A MARS-műveletek szinkron módon futnak a kiszolgálón. A SELECT és a BULK INSERT utasítás egymásba illesztése engedélyezett. Az adatmanipulációs nyelv (DML) és az adatdefiníciós nyelv (DDL) utasításai azonban atomilag futnak. Az atomi köteg végrehajtása közben végrehajtandó összes utasítás le lesz tiltva. A kiszolgáló párhuzamos végrehajtása nem MARS-funkció.
Ha két köteg van elküldve EGY MARS-kapcsolat alatt, amelyek közül az egyik SELECT utasítást tartalmaz, a másik egy DML utasítást tartalmaz, a DML megkezdheti a végrehajtást a SELECT utasítás végrehajtásán belül. A DML-utasításnak azonban a befejezésig kell futnia, mielőtt a SELECT utasítás előrehaladást érhet el. Ha mindkét utasítás ugyanabban a tranzakcióban fut, a SELECT utasítás végrehajtása után a DML-utasítás által végrehajtott módosítások nem láthatók az olvasási művelet számára.
A SELECT utasításban lévő WAITFOR utasítás nem hozza létre a tranzakciót, amíg várakozik, azaz amíg az első sor létre nem jön. Ez azt jelenti, hogy más kötegek nem hajthatók végre ugyanazon a kapcsolaton belül, miközben a WAITFOR utasítás várakozik.
MARS-munkamenet gyorsítótára
Ha a kapcsolat engedélyezve van a MARS-kapcsolattal, létrejön egy logikai munkamenet, amely további többletterhelést jelent. A terhelés minimalizálása és a teljesítmény növelése érdekében az SqlClient gyorsítótárazza a MARS-munkamenetet egy kapcsolaton belül. A gyorsítótár legfeljebb 10 MARS-munkamenetet tartalmaz. Ez az érték nem módosítható a felhasználó számára. Ha eléri a munkamenet-korlátot, új munkamenet jön létre – a rendszer nem hoz létre hibát. A gyorsítótár és a benne található munkamenetek kapcsolatonként vannak; nincsenek megosztva a kapcsolatok között. Amikor egy munkamenet ki van adva, a rendszer visszaadja a készletnek, kivéve, ha elérte a készlet felső korlátját. Ha a gyorsítótárkészlet megtelt, a munkamenet lezárul. A MARS-munkamenetek nem járnak le. A rendszer csak akkor távolítja el őket, ha a kapcsolatobjektum el van távolítva. A MARS-munkamenet gyorsítótára nincs előre betöltve. Betöltődik, mivel az alkalmazás több munkamenetet igényel.
Szálbiztonság
A MARS-műveletek nem szálbiztosak.
Kapcsolatkészletezés
A MARS-kompatibilis kapcsolatok a többi kapcsolathoz hasonlóan vannak készletben. Ha egy alkalmazás két kapcsolatot nyit meg, egyet a MARS engedélyezve van, egyet pedig a MARS letiltott, a két kapcsolat külön készletekben található. További információ: SQL Server-kapcsolatkészletezés (ADO.NET).
SQL Server Batch végrehajtási környezet
A kapcsolat megnyitásakor egy alapértelmezett környezet lesz definiálva. Ezt a környezetet ezután a rendszer egy logikai MARS-munkamenetbe másolja.
A kötegvégrehajtási környezet a következő összetevőket tartalmazza:
Beállítások megadása (például ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)
Biztonsági környezet (felhasználó-/alkalmazásszerepkör)
Adatbázis-környezet (aktuális adatbázis)
Végrehajtási állapot változói (például @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)
Felső szintű ideiglenes táblák
A MARS használatával egy alapértelmezett végrehajtási környezet van társítva egy kapcsolathoz. Minden új köteg, amely egy adott kapcsolat alatt kezdi meg a végrehajtást, megkapja az alapértelmezett környezet másolatát. Amikor a kódot egy adott köteg alatt hajtják végre, a környezet összes módosítása az adott kötegre terjed ki. A végrehajtás befejeződése után a rendszer a végrehajtási beállításokat az alapértelmezett környezetbe másolja. Ha egyetlen köteg több parancsot ad ki, amelyeket egymás után kell végrehajtani ugyanabban a tranzakcióban, a szemantika megegyezik a korábbi ügyfeleket vagy kiszolgálókat érintő kapcsolatok által közzétettekkel.
Párhuzamos végrehajtás
A MARS nem úgy lett kialakítva, hogy eltávolítsa az alkalmazások több kapcsolatára vonatkozó összes követelményt. Ha egy alkalmazásnak a parancsok valós párhuzamos végrehajtására van szüksége egy kiszolgálón, több kapcsolatot kell használnia.
Vegyük például a következő forgatókönyvet: Két parancsobjektum jön létre, az egyik egy eredményhalmaz feldolgozására, a másik pedig az adatok frissítésére; közös kapcsolatot létesítenek a MARS-on keresztül. Ebben a forgatókönyvben a Transaction
.Commit
a frissítés meghiúsul, amíg az összes eredmény be nem olvasható az első parancsobjektumon, ami a következő kivételt eredményezi:
Üzenet: Egy másik munkamenet által használt tranzakciókörnyezet.
Forrás: .NET SqlClient-adatszolgáltató
Várt: (null)
Érkezett: System.Data.SqlClient.SqlException
A forgatókönyv kezelésére három lehetőség áll rendelkezésre:
Indítsa el a tranzakciót az olvasó létrehozása után, hogy az ne legyen része a tranzakciónak. Ezután minden frissítés saját tranzakcióvá válik.
Az olvasó bezárása után véglegesítse az összes munkát. Ez jelentős frissítési kötegre is képes.
Ne használja a MARS-t; ehelyett használjon külön kapcsolatot minden parancsobjektumhoz, mint a MARS előtt.
MARS-támogatás észlelése
Az alkalmazás az érték olvasásával ellenőrizheti a SqlConnection.ServerVersion
MARS-támogatást. A fő szám az SQL Server 2005 esetén 9, az SQL Server 2008 esetében pedig 10 lehet.