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


TRANZAKCIÓELKÜLÖNÍTÉSI SZINT BEÁLLÍTÁSA (Transact-SQL)

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

Az SQL Server-kapcsolat által kiadott Transact-SQL utasítások zárolási és sor-verziószámozási viselkedését szabályozza.

Transact-SQL szintaxis konvenciók

Szemantika

Szintaxis az SQL Serverhez, az Azure SQL Database-hez és az SQL Database-hez a Microsoft Fabricben.

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

Az Azure Synapse Analytics és a párhuzamos adattárház szintaxisa.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Megjegyzés:

Az Azure Synapse Analytics ACID-tranzakciókat valósít meg. Az alapértelmezett elkülönítési szint a .READ UNCOMMITTED Ezt úgy módosíthatja, hogy READ COMMITTED SNAPSHOT ISOLATION bekapcsolja ON a READ_COMMITTED_SNAPSHOT felhasználói adatbázis adatbázis-beállítását, amikor csatlakozik az master adatbázishoz. Ha engedélyezve van, a rendszer az adatbázis összes tranzakcióját végrehajtja READ COMMITTED SNAPSHOT ISOLATION , és a munkamenet szintjén megadott beállítások READ UNCOMMITTED nem teljesülnek. További információ: ALTER DATABASE SET options (Transact-SQL).

Arguments

NEM VÉGLEGESÍTETT OLVASÁS

Megadja, hogy az utasítások beolvassák azokat a sorokat, amelyeket más tranzakciók módosítottak, de még nem véglegesítettek.

A szinten futó READ UNCOMMITTED tranzakciók nem adnak ki megosztott zárolásokat, hogy más tranzakciók ne módosíthassák az aktuális tranzakció által beolvasott adatokat. READ UNCOMMITTED a tranzakciókat nem tiltják le kizárólagos zárolások, amelyek megakadályozzák, hogy az aktuális tranzakció beolvassa azokat a sorokat, amelyeket módosítottak, de más tranzakciók nem véglegesítettek. Ha ez a beállítás be van állítva, beolvasható a nem véglegesített módosítások, amelyeket piszkos olvasásnak neveznek. Az adatok értékei módosíthatók, és a sorok megjelenhetnek vagy eltűnhetnek az adatkészletben a tranzakció vége előtt. Ez a beállítás ugyanolyan hatással van, mint a tranzakció összes NOLOCK utasításában szereplő összes táblára vonatkozó beállításSELECT. Ez a legkevésbé korlátozó az elkülönítési szinteken.

Az SQL Serveren minimalizálhatja a zárolási versengést, miközben a tranzakciókat a nem véglegesített adatmódosítások piszkos olvasása ellen is megvédheti a következőkkel:

  • Az READ COMMITTED elkülönítési szint az READ_COMMITTED_SNAPSHOT adatbázis beállításának beállításával ON.

  • Az SNAPSHOT elkülönítési szint. A pillanatkép-elkülönítésről további információt az SQL Server pillanatkép-elkülönítése című témakörben talál.

LEKÖTÖTT OLVASÁS

Megadja, hogy az utasítások nem tudják olvasni azokat az adatokat, amelyeket más tranzakciók módosítottak, de nem véglegesítettek. Ez megakadályozza a piszkos olvasást. Az adatok az aktuális tranzakció egyes utasításai közötti egyéb tranzakciókkal módosíthatók, ami nem megismételhető olvasási vagy fantomadatokat eredményez. Ez a beállítás az SQL Server alapértelmezett beállítása.

A viselkedés az READ COMMITTED adatbázis beállításától READ_COMMITTED_SNAPSHOT függ:

  • Ha READ_COMMITTED_SNAPSHOT az sql serveren az alapértelmezett értékre OFF van állítva, az adatbázismotor megosztott zárolásokkal megakadályozza, hogy más tranzakciók módosítsák a sorokat, miközben az aktuális tranzakció olvasási műveletet futtat. A megosztott zárolások azt is blokkolják, hogy az utasítás beolvassa a többi tranzakció által módosított sorokat, amíg a másik tranzakció be nem fejeződik. A megosztott zárolás típusa határozza meg, hogy mikor szabadul fel. A sorzárak a következő sor feldolgozása előtt szabadulnak fel. Az oldalzárak a következő oldal olvasásakor szabadulnak fel, a táblázatzárak pedig az utasítás befejeződésekor lesznek feloldva.

  • Ha READ_COMMITTED_SNAPSHOT be van állítva ON, az adatbázismotor sor-verziószámozással jeleníti meg az egyes utasításokat az adatok tranzakciós konzisztens pillanatképével, ahogyan az az utasítás elején létezett. A zárolások nem arra szolgálnak, hogy megvédjék az adatokat más tranzakciók frissítésétől.

    • READ_COMMITTED_SNAPSHOT ON az alapértelmezett Azure SQL adatbázis és SQL adatbázis a Microsoft Fabric-ben.

Fontos

A tranzakcióelkülönítési szint kiválasztása nem befolyásolja az adatmódosítások védelme érdekében beszerzett zárolásokat. A tranzakciók mindig kizárólagos zárolást kapnak az általa módosított adatokhoz, és a zárolást a tranzakció befejezéséig őrzik meg, függetlenül attól, hogy az adott tranzakció elkülönítési szintje milyen szinten van megadva. Emellett az READ COMMITTED elkülönítési szinten végrehajtott frissítés a kijelölt adatsorok frissítési zárolását használja, míg az SNAPSHOT elkülönítési szinten végrehajtott frissítés sorverziókat használ a frissíteni kívánt sorok kiválasztásához. Az olvasási műveletek esetében a tranzakcióelkülönítési szintek elsősorban a más tranzakciók által végrehajtott módosítások hatásai elleni védelem szintjét határozzák meg. További információ: Transaction Locking and Row Versioning Guide.

A pillanatkép-elkülönítés támogatja a FILESTREAM-adatokat. Pillanatkép-elkülönítési módban a tranzakció bármely utasítása által beolvasott FILESTREAM-adatok a tranzakció elején létező adatok tranzakcióslag konzisztens verziója.

Ha az READ_COMMITTED_SNAPSHOT adatbázis-beállítás az ON, a táblamutatóval kérheti a READCOMMITTEDLOCK megosztott zárolást a sorok verziószámozása helyett az READ COMMITTED elkülönítési szinten futó tranzakciókban lévő egyes utasítások esetében.

Megjegyzés:

A beállítás megadásakor READ_COMMITTED_SNAPSHOT csak a parancsot végrehajtó ALTER DATABASE kapcsolat engedélyezett az adatbázisban. Csak akkor lehet más nyitott kapcsolat az adatbázisban, ha ALTER DATABASE az befejeződött. Az adatbázisnak nem kell egyfelhasználós módban lennie.

ISMÉTELHETŐ OLVASÁS

Azt adja meg, hogy az utasítások nem tudják olvasni azokat az adatokat, amelyeket más tranzakciók módosítottak, de még nem véglegesítettek, és hogy más tranzakciók nem módosíthatják az aktuális tranzakció által beolvasott adatokat, amíg az aktuális tranzakció be nem fejeződik.

A megosztott zárolások a tranzakció egyes utasításai által beolvasott összes adatra kerülnek, és a tranzakció befejezéséig vannak tárolva. Ez megakadályozza, hogy más tranzakciók módosítsák az aktuális tranzakció által beolvasott sorokat. Más tranzakciók olyan új sorokat szúrhatnak be, amelyek megfelelnek az aktuális tranzakció által kiadott utasítások keresési feltételeinek. Ha az aktuális tranzakció újrapróbálkozza az utasítást, lekéri az új sorokat, ami fantomolvasást eredményez. Mivel a megosztott zárolások egy tranzakció végéig vannak tárolva, ahelyett, hogy az egyes utasítások végén szabadulnak fel, az egyidejűség alacsonyabb az alapértelmezett READ COMMITTED elkülönítési szintnél. Ezt a lehetőséget csak akkor használja, ha szükséges.

PILLANATFELVÉTEL

Azt adja meg, hogy a tranzakció bármely utasítása által beolvasott adatok a tranzakció elején létező adatok tranzakcióslag konzisztens verziója. A tranzakció csak a tranzakció megkezdése előtt véglegesített adatmódosításokat képes felismerni. Az aktuális tranzakció kezdete után más tranzakciók által végrehajtott adatmódosítások nem láthatók az aktuális tranzakcióban végrehajtó utasításokban. Ennek az a hatása, mintha a tranzakcióban szereplő utasítások pillanatképet kapnak a tranzakció elején meglévő véglegesített adatokról.

Kivéve, ha egy adatbázis helyreállítása folyamatban van, SNAPSHOT a tranzakciók nem kérnek zárolást az adatok olvasásakor. SNAPSHOT az adatokat olvasó tranzakciók nem tiltják le más tranzakciók adatírását. Az adatokat író tranzakciók nem tiltják le SNAPSHOT a tranzakciókat az adatok olvasásában.

Az adatbázis-helyreállítás visszaállítási fázisában a tranzakciók zárolást kérnek, SNAPSHOT ha egy másik, visszaállított tranzakció által zárolt adatok olvasására tett kísérletet. A SNAPSHOT tranzakció le lesz tiltva, amíg a tranzakció vissza nem kerül. A zárolást a zárolás megadása után azonnal feloldjuk.

Az ALLOW_SNAPSHOT_ISOLATION adatbázis-beállítást az elkülönítési szintet használó ON tranzakció elindítása előtt be kell állítaniSNAPSHOT. Ha az elkülönítési SNAPSHOT szintet használó tranzakciók több adatbázisban férnek hozzá az adatokhozALLOW_SNAPSHOT_ISOLATION, ON minden adatbázisban be kell állítani.

A tranzakciók nem állíthatók be SNAPSHOT olyan elkülönítési szintre, amely egy másik elkülönítési szinttel kezdődött; ennek hatására a tranzakció megszakad. Ha egy tranzakció az SNAPSHOT elkülönítési szinten indul el, módosíthatja azt egy másik elkülönítési szintre, majd visszaválthat a következőre SNAPSHOT: . A tranzakció az első alkalommal indul el, amikor hozzáfér az adatokhoz.

Az elkülönítési SNAPSHOT szinten futó tranzakciók megtekinthetik az adott tranzakció módosításait. Ha például a tranzakció végrehajt egy UPDATE táblát, majd egy utasítást SELECT ad ki ugyanahhoz a táblához, a módosított adatok szerepelnek az eredményhalmazban.

Megjegyzés:

Pillanatkép-elkülönítési módban a tranzakció bármely utasítása által beolvasott FILESTREAM-adatok a tranzakció kezdetén létező adatok tranzakcióslag konzisztens verziója, nem pedig az utasítás elején.

SZERIALIZÁLHATÓ

A következő feltételeket adja meg:

  • Az utasítások nem tudják olvasni azokat az adatokat, amelyeket módosítottak, de más tranzakciók még nem véglegesítettek.

  • Más tranzakciók nem módosíthatják az aktuális tranzakció által beolvasott adatokat, amíg az aktuális tranzakció be nem fejeződik.

  • Más tranzakciók nem szúrhatnak be új sorokat olyan kulcsértékekkel, amelyek az aktuális tranzakció bármely utasítása által beolvasott kulcstartományba esnek, amíg az aktuális tranzakció be nem fejeződik.

A tartományzárak a tranzakcióban végrehajtott egyes utasítások keresési feltételeinek megfelelő kulcsértékek tartományába kerülnek. Ez megakadályozza, hogy a többi tranzakció frissítse vagy beszúrja azokat a sorokat, amelyek megfelelnek az aktuális tranzakció által végrehajtott utasításoknak. Ez azt jelenti, hogy ha egy tranzakció bármelyik utasítását másodszor hajtja végre, ugyanazokat a sorokat olvassa be. A tartomány zárolása a tranzakció befejezéséig tart. Ez a legkorlátozóbb az elkülönítési szintek közül, mivel a kulcsok teljes tartományát zárolja, és a zárolásokat a tranzakció befejezéséig tárolja. Mivel az egyidejűség alacsonyabb, ezt a beállítást csak akkor használja, ha szükséges. Ez a beállítás ugyanolyan hatással van, mint a tranzakció összes HOLDLOCK utasításában szereplő összes táblára vonatkozó beállításSELECT.

Megjegyzések

Egyszerre csak az egyik elkülönítési szint beállítás adható meg, és a kapcsolat csak akkor lesz beállítva, ha az explicit módon nem változik. A tranzakcióban végrehajtott összes olvasási művelet a megadott elkülönítési szint szabályai szerint működik, kivéve, ha egy utasítás záradékában FROM található táblamutató eltérő zárolási vagy verziószámozási viselkedést határoz meg egy táblához.

A tranzakcióelkülönítési szintek határozzák meg az olvasási műveletekhez beszerzett zárolások típusát. A megosztott zárolások a sorzárakhoz vagy általában a sorzárakhoz READ COMMITTEDREPEATABLE READ lettek beszerezve, bár a sorzárak lap- vagy táblázatzárolásokra eszkalálhatók, ha egy lap vagy táblázat sorainak jelentős részére hivatkozik az olvasás. Ha a tranzakció az olvasás után módosít egy sort, a tranzakció egy kizárólagos zárolást szerez be a sor védelmére, és a kizárólagos zárolás a tranzakció befejezéséig megmarad. Ha például egy REPEATABLE READ tranzakció egy sorban megosztott zárolással rendelkezik, és a tranzakció módosítja a sort, a megosztott sor zárolása kizárólagos sorzárolássá alakul.

Egy kivétellel a tranzakció során bármikor válthat az egyik elkülönítési szintről a másikra. A kivétel akkor fordul elő, ha az elkülönítési szintről az elkülönítésre SNAPSHOT vált. Ennek hatására a tranzakció meghiúsul, és visszagördül. Az elszigetelten SNAPSHOT indított tranzakciókat azonban bármely más elkülönítési szintre módosíthatja.

Amikor egy tranzakciót egy elkülönítési szintről egy másikra módosít, a módosítás után beolvasott erőforrások az új szint szabályainak megfelelően lesznek védve. A módosítás előtt beolvasott erőforrások továbbra is az előző szint szabályainak megfelelően lesznek védve. Ha például egy tranzakció át lett váltva READ COMMITTEDSERIALIZABLE, a módosítás után beszerzett megosztott zárolások a tranzakció végéig lesznek megtartva.

Tárolt SET TRANSACTION ISOLATION LEVEL eljárás vagy eseményindító esetén az objektum visszatérésekor a rendszer visszaállítja az elkülönítési szintet az objektum meghívásakor érvényben lévő szintre. Ha például egy kötegben van beállítva REPEATABLE READ , és a köteg meghív egy tárolt eljárást, amely az elkülönítési szintet SERIALIZABLEállítja be, az elkülönítési szint beállítása visszaáll REPEATABLE READ , amikor a tárolt eljárás visszaadja a vezérlést a kötegnek.

Megjegyzés:

A felhasználó által definiált függvények és a közös nyelvi futtatókörnyezet (CLR) felhasználó által definiált típusai nem hajthatók végre SET TRANSACTION ISOLATION LEVEL. Az elkülönítési szintet azonban egy táblázatos tipp használatával felülbírálhatja. További információkért lásd: Tábla-javallatok (Transact-SQL).

Ha két munkamenetet köt sp_bindsession össze, minden munkamenet megtartja az elkülönítési szint beállítását. Ha SET TRANSACTION ISOLATION LEVEL egy munkamenet elkülönítési szintjének beállítását szeretné módosítani, az nem befolyásolja a hozzá tartozó többi munkamenet beállítását.

SET TRANSACTION ISOLATION LEVEL végrehajtáskor vagy futtatáskor lép érvénybe, és nem elemzési időpontban.

A halom halomra optimalizált tömeges terhelési műveletek blokkolják a következő elkülönítési szinteken futó lekérdezéseket:

  • SNAPSHOT
  • READ UNCOMMITTED
  • READ COMMITTED sorverziók használata

Ezzel szemben az ilyen elkülönítési szinteken futó lekérdezések blokkolják az optimalizált tömeges terhelési műveleteket a halmokon. A tömeges betöltési műveletekről további információt az adatok tömeges importálása és exportálása (SQL Server) című témakörben talál.

A FILESTREAM-kompatibilis adatbázisok a következő tranzakcióelkülönítési szinteket támogatják.

Elkülönítési szint Transact-SQL hozzáférés Fájlrendszer-hozzáférés
Nem véglegesített olvasás SQL Server Nem támogatott
Lekötött olvasás SQL Server SQL Server
Ismételhető olvasás SQL Server Nem támogatott
Szerializálható SQL Server Nem támogatott
Lekötött pillanatkép olvasása SQL Server SQL Server
Pillanatkép SQL Server SQL Server

Példák

Az alábbi példa beállítja a TRANSACTION ISOLATION LEVEL munkamenethez tartozó adatokat. Minden Transact-SQL következő utasítás esetében az SQL Server az összes megosztott zárolást a tranzakció végéig tárolja.

USE AdventureWorks2022;
GO

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO

BEGIN TRANSACTION;
GO

SELECT *
FROM HumanResources.EmployeePayHistory;
GO

SELECT *
FROM HumanResources.Department;
GO

COMMIT TRANSACTION;
GO