Dela via


BEGIN TRANSACTION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)Lager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Markerar startpunkten för en explicit, lokal transaktion. Explicita transaktioner börjar med -instruktionen BEGIN TRANSACTION och slutar med instruktionen COMMIT eller ROLLBACK .

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database, Fabric SQL Database och Azure SQL Managed Instance.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Syntax för Fabric Data Warehouse, Azure Synapse Analytics och Analytics Platform System (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database och Azure SQL Managed Instance

Namnet som tilldelats transaktionen. transaction_name måste följa reglerna för identifierare, men identifierare som är längre än 32 tecken tillåts inte. Använd endast transaktionsnamn i det yttersta paret med kapslade BEGIN...COMMIT eller BEGIN...ROLLBACK instruktioner. transaction_name är alltid skiftlägeskänslig, även om instansen av SQL Server inte är skiftlägeskänslig.

@tran_name_variable

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database och Azure SQL Managed Instance

Namnet på en användardefinierad variabel som innehåller ett giltigt transaktionsnamn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar . Om fler än 32 tecken skickas till variabeln används endast de första 32 tecknen. Återstående tecken trunkeras.

MED MARK [ "beskrivning" ]

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database och Azure SQL Managed Instance

Anger att transaktionen är markerad i loggen. beskrivning är en sträng som beskriver märket. En beskrivning som är längre än 128 tecken trunkeras till 128 tecken innan den msdb.dbo.logmarkhistory lagras i tabellen.

Om WITH MARK används måste ett transaktionsnamn anges. WITH MARK gör det möjligt att återställa en transaktionslogg till ett namngivet märke.

Remarks

BEGIN TRANSACTION ökar med @@TRANCOUNT1.

BEGIN TRANSACTION representerar en punkt där de data som refereras till av en anslutning är logiskt och fysiskt konsekventa. Om fel påträffas kan alla dataändringar som görs efter BEGIN TRANSACTION återställningen återställas för att returnera data till detta kända konsekvenstillstånd. Varje transaktion varar tills den antingen slutförs utan fel och COMMIT TRANSACTION utfärdas för att göra ändringarna till en permanent del av databasen, eller så påträffas fel och alla ändringar raderas med en ROLLBACK TRANSACTION instruktion.

BEGIN TRANSACTION startar en lokal transaktion för anslutningen som utfärdar -instruktionen. Beroende på de aktuella inställningarna på transaktionsisoleringsnivå låses många resurser som har köpts för att stödja Transact-SQL-instruktioner som utfärdats av anslutningen av transaktionen tills den har slutförts med antingen en COMMIT TRANSACTION - eller ROLLBACK TRANSACTION -instruktion. Transaktioner som har lämnats utestående under långa tidsperioder kan hindra andra användare från att komma åt dessa låsta resurser och kan också förhindra loggtrunkering.

Även om BEGIN TRANSACTION startar en lokal transaktion registreras den inte i transaktionsloggen förrän programmet sedan utför en åtgärd som måste registreras i loggen, till exempel att köra en INSERT, UPDATEeller DELETE -instruktion. Ett program kan utföra åtgärder som att hämta lås för att skydda transaktionsisoleringsnivån för SELECT instruktioner, men ingenting registreras i loggen förrän programmet utför en ändringsåtgärd.

Att namnge flera transaktioner i en serie kapslade transaktioner med ett transaktionsnamn har liten effekt på transaktionen. Endast det första (yttersta) transaktionsnamnet registreras i systemet. En återställning till ett annat namn (förutom ett giltigt savepoint-namn) genererar ett fel. Ingen av de instruktioner som kördes före återställningen återställs i själva verket när det här felet inträffar. Uttrycken återställs endast när den yttre transaktionen återställs.

Den lokala transaktion som startades av -instruktionen BEGIN TRANSACTION eskaleras till en distribuerad transaktion om följande åtgärder utförs innan instruktionen checkas in eller återställs:

  • En INSERT- eller DELETEUPDATE -instruktion som refererar till en fjärrtabell på en länkad server körs. Instruktionen INSERT, UPDATEeller DELETE misslyckas om OLE DB-providern som används för att komma åt den länkade servern inte stöder ITransactionJoin gränssnittet.

  • Ett anrop görs till en fjärr lagrad procedur när REMOTE_PROC_TRANSACTIONS alternativet är inställt på ON.

Den lokala kopian av SQL Server blir transaktionskontrollant och använder Microsoft Distributed Transaction Coordinator (MS DTC) för att hantera den distribuerade transaktionen.

En transaktion kan uttryckligen köras som en distribuerad transaktion med hjälp BEGIN DISTRIBUTED TRANSACTIONav . Mer information finns i BEGIN DISTRIBUTED TRANSACTION (BÖRJA DISTRIBUERAD TRANSAKTION).

När SET IMPLICIT_TRANSACTIONS är inställt på ONskapar en BEGIN TRANSACTION -instruktion två kapslade transaktioner. Mer information finns i SET-IMPLICIT_TRANSACTIONS.

Markerade transaktioner

Alternativet WITH MARK gör att transaktionsnamnet placeras i transaktionsloggen. När du återställer en databas till ett tidigare tillstånd kan den markerade transaktionen användas i stället för ett datum och en tid. Mer information finns i Använda markerade transaktioner för att återställa relaterade databaser konsekvent och RESTORE-instruktioner.

Dessutom är transaktionsloggmärken nödvändiga om du behöver återställa en uppsättning relaterade databaser till ett logiskt konsekvent tillstånd. Markeringar kan placeras i transaktionsloggarna för de relaterade databaserna genom en distribuerad transaktion. Om du återställer uppsättningen relaterade databaser till dessa markeringar resulterar det i en uppsättning databaser som är transaktionsmässigt konsekventa. Placering av märken i relaterade databaser kräver särskilda procedurer.

Märket placeras endast i transaktionsloggen om databasen uppdateras av den markerade transaktionen. Transaktioner som inte ändrar data markeras inte.

BEGIN TRANSACTION <new_name> WITH MARK kan kapslas i en redan befintlig transaktion som inte är markerad. När du gör det <new_name> blir det marknamnet för transaktionen, trots namnet som transaktionen kanske redan har angetts. I följande exempel M2 är namnet på märket.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

När du kapslade transaktioner får du följande varningsmeddelande om du försöker markera en transaktion som redan är markerad:

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

Permissions

Kräver medlemskap i offentlig roll.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Använda en explicit transaktion

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT;

B. Återställa en transaktion

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

I följande exempel visas effekten av att återställa en transaktion. I det här exemplet återställer instruktionen ROLLBACK -instruktionen INSERT , men den skapade tabellen finns fortfarande.

CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
    INSERT INTO ValueTable VALUES(1);
    INSERT INTO ValueTable VALUES(2);
ROLLBACK;

C. Namnge en transaktion

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance

I följande exempel visas hur du namnger en transaktion.

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

D. Markera en transaktion

Gäller för: SQL Server 2008 (10.0.x) och senare versioner, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance

I följande exempel visas hur du markerar en transaktion. Transaktionen CandidateDelete är markerad.

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO