Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-databas i Förhandsversion av Microsoft Fabric
Styr låsnings- och radversionsbeteendet för Transact-SQL-instruktioner som utfärdats av en anslutning till SQL Server.
              
              
              Transact-SQL syntaxkonventioner
Syntax
Syntax för SQL Server, Azure SQL Database och SQL Database i Förhandsversionen av Microsoft Fabric.
SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
Syntax för Azure Synapse Analytics och Parallel Data Warehouse.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Anmärkning
Azure Synapse Analytics implementerar ACID-transaktioner. Standardisoleringsnivån är READ UNCOMMITTED. Du kan ändra det till genom att READ COMMITTED SNAPSHOT ISOLATION ändra ON databasalternativet READ_COMMITTED_SNAPSHOT för en användardatabas när du master är ansluten till databasen. När den är aktiverad körs alla transaktioner i den här databasen under READ COMMITTED SNAPSHOT ISOLATION och inställningen READ UNCOMMITTED på sessionsnivå respekteras inte. Mer information finns i ALTER DATABASE SET options (Transact-SQL).
Arguments
LÄS EJ KOMMENDERADE
Anger att instruktioner kan läsa rader som har ändrats av andra transaktioner men som ännu inte har checkats in.
Transaktioner som körs på READ UNCOMMITTED nivån utfärdar inte delade lås för att förhindra att andra transaktioner ändrar data som läss av den aktuella transaktionen. 
              READ UNCOMMITTED transaktioner blockeras inte heller av exklusiva lås som hindrar den aktuella transaktionen från att läsa rader som har ändrats men inte checkats in av andra transaktioner. När det här alternativet har angetts går det att läsa icke-utelämnade ändringar, som kallas för smutsiga läsningar. Värden i data kan ändras och rader kan visas eller försvinna i datauppsättningen före transaktionens slut. Det här alternativet har samma effekt som inställningen NOLOCK för alla tabeller i alla SELECT instruktioner i en transaktion. Detta är den minst restriktiva av isoleringsnivåerna.
I SQL Server kan du också minimera låsningskonkurrationen samtidigt som du skyddar transaktioner från felaktiga läsningar av icke-utelämnade dataändringar med hjälp av något av följande:
- Isoleringsnivån - READ COMMITTEDmed databasalternativet- READ_COMMITTED_SNAPSHOTinställt på- ON.
- Isoleringsnivån - SNAPSHOT. Mer information om ögonblicksbildisolering finns i Ögonblicksbildisolering i SQL Server.
LÄS BEKRÄFTAD
Anger att instruktioner inte kan läsa data som har ändrats men inte utförts av andra transaktioner. Detta förhindrar smutsiga läsningar. Data kan ändras av andra transaktioner mellan enskilda instruktioner i den aktuella transaktionen, vilket resulterar i icke-återskapande läsningar eller fiktiva data. Det här alternativet är standardinställningen för SQL Server.
Beteendet READ COMMITTED för beror på inställningen för databasalternativet READ_COMMITTED_SNAPSHOT :
- Om - READ_COMMITTED_SNAPSHOTär inställt- OFFpå (standardvärdet på SQL Server) använder databasmotorn delade lås för att förhindra att andra transaktioner ändrar rader medan den aktuella transaktionen kör en läsåtgärd. De delade låsen blockerar också instruktionen från att läsa rader som ändrats av andra transaktioner tills den andra transaktionen har slutförts. Den delade låstypen avgör när den släpps. Radlås frigörs innan nästa rad bearbetas. Sidlås släpps när nästa sida läse och tabelllås släpps när instruktionen är klar.
- Om - READ_COMMITTED_SNAPSHOTär inställt på- ONanvänder databasmotorn radversioner för att presentera varje -instruktion med en transaktionsmässigt konsekvent ögonblicksbild av data som den fanns i början av -instruktionen. Lås används inte för att skydda data från uppdateringar av andra transaktioner.- 
              READ_COMMITTED_SNAPSHOTONär standardvärdet för Azure SQL Database och SQL Database i Förhandsversionen av Microsoft Fabric.
 
- 
              
Viktigt!
Att välja en transaktionsisoleringsnivå påverkar inte de lås som hämtas för att skydda dataändringar. En transaktion får alltid ett exklusivt lås på alla data som den ändrar och håller låset tills transaktionen har slutförts, oavsett vilken isoleringsnivå som angetts för transaktionen. Dessutom använder en uppdatering som görs på READ COMMITTED isoleringsnivå uppdateringslås på de valda dataraderna, medan en uppdatering som görs på SNAPSHOT isoleringsnivå använder radversioner för att välja rader som ska uppdateras. För läsåtgärder definierar transaktionsisoleringsnivåer främst skyddsnivån från effekterna av ändringar som görs av andra transaktioner. Mer information finns i Guiden för transaktionslåsning och radversion.
Ögonblicksbildisolering stöder FILESTREAM-data. I läget för ögonblicksbildisolering är FILESTREAM-data som läss av en instruktion i en transaktion den transaktionsmässigt konsekventa versionen av de data som fanns i början av transaktionen.
När databasalternativet READ_COMMITTED_SNAPSHOT är ONkan du använda tabelltipset READCOMMITTEDLOCK för att begära delad låsning i stället för radversioner för enskilda instruktioner i transaktioner som körs på READ COMMITTED isoleringsnivå.
Anmärkning
När du anger alternativet READ_COMMITTED_SNAPSHOT tillåts endast anslutningen som ALTER DATABASE kör kommandot i databasen. Det får inte finnas någon annan öppen anslutning i databasen förrän ALTER DATABASE den är klar. Databasen behöver inte vara i enanvändarläge.
REPETERBAR LÄSNING
Anger att instruktioner inte kan läsa data som har ändrats men som ännu inte har checkats in av andra transaktioner och att inga andra transaktioner kan ändra data som lästes av den aktuella transaktionen förrän den aktuella transaktionen har slutförts.
Delade lås placeras på alla data som läss av varje instruktion i transaktionen och hålls kvar tills transaktionen har slutförts. Detta förhindrar att andra transaktioner ändrar alla rader som har lästs av den aktuella transaktionen. Andra transaktioner kan infoga nya rader som matchar sökvillkoren för instruktioner som utfärdats av den aktuella transaktionen. Om den aktuella transaktionen sedan försöker utföra instruktionen igen hämtar den de nya raderna, vilket resulterar i fantomläsningar. Eftersom delade lås hålls till slutet av en transaktion i stället för att släppas i slutet av varje -instruktion är samtidigheten lägre än standardisoleringsnivån READ COMMITTED . Använd endast det här alternativet när det behövs.
ÖGONBLICKSBILD
Anger att data som läse av en instruktion i en transaktion är den transaktionsmässigt konsekventa versionen av de data som fanns i början av transaktionen. Transaktionen kan bara identifiera dataändringar som har genomförts före transaktionens start. Dataändringar som görs av andra transaktioner efter starten av den aktuella transaktionen är inte synliga för instruktioner som körs i den aktuella transaktionen. Effekten är som om uttrycken i en transaktion får en ögonblicksbild av de incheckade data som de fanns i början av transaktionen.
Förutom när en databas återställs SNAPSHOT begär transaktioner inte lås när data läss. 
              SNAPSHOT transaktioner som läser data blockerar inte andra transaktioner från att skriva data. Transaktioner som skriver data blockerar SNAPSHOT inte transaktioner från att läsa data.
Under återställningsfasen för en databasåterställning SNAPSHOT begär transaktioner ett lås om ett försök görs att läsa data som är låsta av en annan transaktion som återställs. Transaktionen SNAPSHOT blockeras tills transaktionen återställs. Låset släpps omedelbart efter att det har beviljats.
Databasalternativet ALLOW_SNAPSHOT_ISOLATION måste anges till ON innan du kan starta en transaktion som använder SNAPSHOT isoleringsnivån. Om en transaktion som använder SNAPSHOT isoleringsnivån kommer åt data i flera databaser ALLOW_SNAPSHOT_ISOLATION måste anges till ON i varje databas.
En transaktion kan inte ställas in på SNAPSHOT isoleringsnivå som började med en annan isoleringsnivå, vilket gör att transaktionen avbryts. Om en transaktion startar på SNAPSHOT isoleringsnivån kan du ändra den till en annan isoleringsnivå och sedan tillbaka till SNAPSHOT. En transaktion startar första gången den kommer åt data.
En transaktion som körs under SNAPSHOT isoleringsnivå kan visa ändringar som gjorts av den transaktionen. Om transaktionen till exempel utför en UPDATE på en tabell och sedan utfärdar en SELECT instruktion mot samma tabell inkluderas de ändrade data i resultatuppsättningen.
Anmärkning
I läget för ögonblicksbildisolering är FILESTREAM-data som läss av en instruktion i en transaktion den transaktionsmässigt konsekventa versionen av de data som fanns i början av transaktionen, inte i början av -instruktionen.
SERIALISERAS
Anger följande villkor:
- Instruktioner kan inte läsa data som har ändrats men som ännu inte har checkats in av andra transaktioner. 
- Inga andra transaktioner kan ändra data som lästes av den aktuella transaktionen förrän den aktuella transaktionen har slutförts. 
- Andra transaktioner kan inte infoga nya rader med nyckelvärden som skulle falla i intervallet för nycklar som läss av några instruktioner i den aktuella transaktionen förrän den aktuella transaktionen har slutförts. 
Intervalllås placeras i intervallet med nyckelvärden som matchar sökvillkoren för varje instruktion som körs i en transaktion. Detta blockerar andra transaktioner från att uppdatera eller infoga rader som skulle kvalificera sig för någon av de instruktioner som körs av den aktuella transaktionen. Det innebär att om någon av uttrycken i en transaktion körs en andra gång läser de samma uppsättning rader. Intervalllåsen hålls kvar tills transaktionen har slutförts. Detta är den mest restriktiva av isoleringsnivåerna eftersom det låser hela intervall med nycklar och håller låsen tills transaktionen har slutförts. Eftersom samtidigheten är lägre använder du endast det här alternativet när det behövs. Det här alternativet har samma effekt som inställningen HOLDLOCK för alla tabeller i alla SELECT instruktioner i en transaktion.
Anmärkningar
Endast ett av alternativen på isoleringsnivån kan anges i taget, och det förblir inställt för den anslutningen tills den uttryckligen har ändrats. Alla läsåtgärder som utförs inom transaktionen fungerar enligt reglerna för den angivna isoleringsnivån, såvida inte ett tabelltips i instruktionens FROM sats anger olika låsnings- eller versionsbeteenden för en tabell.
Transaktionsisoleringsnivåerna definierar vilken typ av lås som hämtas vid läsåtgärder. Delade lås som hämtas för READ COMMITTED eller REPEATABLE READ är vanligtvis radlås, även om radlåsen kan eskaleras till sid- eller tabelllås om ett betydande antal rader i en sida eller tabell refereras till avläsningen. Om transaktionen ändrar en rad efter att den har lästs, hämtar transaktionen ett exklusivt lås för att skydda den raden och det exklusiva låset behålls tills transaktionen har slutförts. Om en REPEATABLE READ transaktion till exempel har ett delat lås på en rad och transaktionen sedan ändrar raden konverteras det delade radlåset till ett exklusivt radlås.
Med ett undantag kan du växla från en isoleringsnivå till en annan när som helst under en transaktion. Undantaget inträffar när du ändrar från isoleringsnivå till SNAPSHOT isolering. Detta gör att transaktionen misslyckas och återställs. Du kan dock ändra en transaktion som startats isolerat SNAPSHOT till någon annan isoleringsnivå.
När du ändrar en transaktion från en isoleringsnivå till en annan skyddas resurser som läse efter ändringen enligt reglerna på den nya nivån. Resurser som läse innan ändringen fortsätter att skyddas enligt reglerna på föregående nivå. Om en transaktion till exempel har ändrats från READ COMMITTED till SERIALIZABLElagras de delade låsen som hämtats efter ändringen till slutet av transaktionen.
Om du utfärdar SET TRANSACTION ISOLATION LEVEL en lagrad procedur eller utlösare återställs isoleringsnivån till den nivå som gäller när objektet anropades när objektet returnerar kontrollen. Om du till exempel anger REPEATABLE READ i en batch och batchen anropar en lagrad procedur som anger isoleringsnivån till SERIALIZABLEåtergår inställningen på isoleringsnivå till REPEATABLE READ när den lagrade proceduren returnerar kontrollen till batchen.
Anmärkning
Användardefinierade funktioner och clr-användardefinierade typer (Common Language Runtime) kan inte köra SET TRANSACTION ISOLATION LEVEL. Du kan dock åsidosätta isoleringsnivån med hjälp av ett tabelltips. Mer information finns i Tabelltips (Transact-SQL).
När du använder sp_bindsession för att binda två sessioner behåller varje session inställningen för isoleringsnivå. Om du ändrar SET TRANSACTION ISOLATION LEVEL inställningen för isoleringsnivå för en session påverkas inte inställningen för andra sessioner som är bundna till den.
              SET TRANSACTION ISOLATION LEVEL börjar gälla vid körning eller körning, och inte vid parsningstid.
Optimerade massinläsningsåtgärder på heaps-blockfrågor som körs under följande isoleringsnivåer:
- SNAPSHOT
- READ UNCOMMITTED
- 
              READ COMMITTEDanvända radversioner
Omvänt blockerar frågor som körs under dessa isoleringsnivåer optimerade massinläsningsåtgärder på heaps. Mer information om massinläsningsåtgärder finns i Massimport och export av data (SQL Server).
FILESTREAM-aktiverade databaser stöder följande transaktionsisoleringsnivåer.
| Isoleringsnivå | Transact-SQL åtkomst | Filsystemåtkomst | 
|---|---|---|
| Läsa okommenterade | SQL Server | Inte stödd | 
| Läs bekräftad | SQL Server | SQL Server | 
| Repeterbar läsning | SQL Server | Inte stödd | 
| Serialiseras | SQL Server | Inte stödd | 
| Läs bekräftad ögonblicksbild | SQL Server | SQL Server | 
| Snapshot | SQL Server | SQL Server | 
Examples
I följande exempel anges TRANSACTION ISOLATION LEVEL för sessionen. För varje Transact-SQL-instruktion som följer, innehåller SQL Server alla delade lås till slutet av transaktionen.
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