Megosztás a következőn keresztül:


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:

  1. 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.

  2. 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.

  3. 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.

Lásd még