BEGIN TRANSACTION (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in Microsoft Fabric

Contrassegna il punto di inizio di una transazione locale esplicita. Le transazioni esplicite iniziano con l'istruzione BEGIN TRANSACTION e terminano con l'istruzione COMMIT o ROLLBACK.

Convenzioni di sintassi Transact-SQL

Sintassi

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

transaction_name
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure

Nome assegnato alla transazione. transaction_name deve essere conforme alle regole per gli identificatori, ma non sono consentiti identificatori composti da più di 32 caratteri. Nel caso di istruzioni BEGIN...COMMIT o BEGIN...ROLLBACK nidificate, utilizzare solo i nomi di transazione nella coppia esterna. In transaction_name viene sempre applicata la distinzione tra maiuscole e minuscole, anche quando l'istanza di SQL Server non prevede distinzione tra maiuscole e minuscole.

@tran_name_variable
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure

Nome di una variabile definita dall'utente contenente un nome di transazione valido. La variabile deve essere dichiarata con un tipo di dati char, varchar, nchar o nvarchar. Se alla variabile vengono passati più di 32 caratteri, verranno utilizzati solo i primi 32 e i restanti caratteri saranno troncati.

WITH MARK [ 'description' ]
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure

Viene specificato che la transazione è contrassegnata nel log. description è una stringa che descrive il contrassegno. Un argomento description con più di 128 caratteri viene troncato in corrispondenza di questo limite prima di essere archiviato nella tabella msdb.dbo.logmarkhistory.

Se si utilizza WITH MARK, è necessario specificare un nome di transazione. Questa opzione consente di ripristinare un log delle transazioni fino al punto, o contrassegno, specificato.

Osservazioni generali

BEGIN TRANSACTION incrementa @@TRANCOUNT di 1.

L'istruzione BEGIN TRANSACTION rappresenta un punto in cui i dati a cui viene fatto riferimento in una connessione sono consistenti dal punto di vista logico e fisico. Se vengono rilevati uno o più errori, è possibile eseguire il rollback di tutte le modifiche apportate ai dati dopo l'istruzione BEGIN TRANSACTION per ripristinare questo stato di consistenza noto dei dati. Una transazione risulta aperta fino a quando non viene eseguita l'istruzione COMMIT TRANSACTION per rendere permanenti le modifiche se non si è verificato alcun errore oppure fino a quando non viene eseguita l'istruzione ROLLBACK TRANSACTION per annullare tutte le modifiche se vengono rilevati errori.

L'istruzione BEGIN TRANSACTION avvia una transazione locale per la connessione in cui viene eseguita. In base alle impostazioni correnti del livello di isolamento della transazione, molte risorse utilizzate per il supporto delle istruzioni Transact-SQL eseguite dalla connessione vengono bloccate dalla transazione fino al relativo completamento con un'istruzione COMMIT TRANSACTION o ROLLBACK TRANSACTION. Le transazioni che rimangono in sospeso per un periodo di tempo prolungato possono impedire l'accesso a queste risorse bloccate da parte di altri utenti nonché il troncamento del log.

Le transazioni locali avviate tramite l'istruzione BEGIN TRANSACTION vengono registrate nel log delle transazioni solo quando l'applicazione esegue un'operazione che richiede la registrazione nel log, ad esempio un'istruzione INSERT, UPDATE o DELETE. Anche se un'applicazione esegue varie operazioni, ad esempio l'acquisizione di blocchi per proteggere il livello di isolamento della transazione di istruzioni SELECT, la registrazione nel log avviene solo quando l'applicazione esegue un'operazione di modifica.

L'assegnazione di un nome di transazione a più transazioni nidificate ha un effetto limitato sulla transazione. Nel sistema viene registrato solo il nome della prima transazione (quella più esterna). Se si tenta di eseguire il rollback fino a un nome diverso da quello di un punto di salvataggio valido, viene generato un errore. Quando si verifica l'errore, nessuna delle istruzioni eseguite prima del rollback viene annullata. Il rollback delle istruzioni viene eseguito solo in corrispondenza del rollback della transazione esterna.

La transazione locale avviata dall'istruzione BEGIN TRANSACTION viene trasformata mediante escalation in una transazione distribuita se vengono eseguite le operazioni seguenti prima del commit o del rollback dell'istruzione:

  • Esecuzione di un'istruzione INSERT, DELETE o UPDATE in cui viene fatto riferimento a una tabella remota in un server collegato. L'istruzione INSERT, UPDATE o DELETE ha esito negativo se il provider OLE DB usato per l'accesso al server collegato non supporta l'interfaccia ITransactionJoin.

  • Esecuzione di una chiamata a una stored procedure remota quando l'opzione REMOTE_PROC_TRANSACTIONS è impostata su ON.

La copia locale di SQL Server diventa il controller della transazione e usa Microsoft Distributed Transaction Coordinator (MS DTC) per gestire la transazione distribuita.

È possibile eseguire una transazione in modo esplicito come transazione distribuita tramite l'istruzione BEGIN DISTRIBUTED TRANSACTION. Per altre informazioni, vedere BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Quando l'opzione SET IMPLICIT_TRANSACTIONS è impostata su ON, tramite un'istruzione BEGIN TRANSACTION vengono create due transazioni nidificate. Per altre informazioni, vedere SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transazioni contrassegnate

Quando si specifica l'opzione WITH MARK, il nome della transazione viene inserito nel log delle transazioni. La transazione contrassegnata può essere utilizzata in sostituzione della data e dell'ora per il ripristino di uno stato precedente di un database. Per altre informazioni, vedere Usare transazioni contrassegnate per recuperare coerentemente i database correlati (modello di recupero con registrazione completa) e RESTORE (Transact-SQL).

I contrassegni del log delle transazioni sono inoltre necessari quando si desidera recuperare uno stato consistente dal punto di vista logico per un set di database correlati. È possibile inserire contrassegni nei log delle transazioni dei database correlati tramite una transazione distribuita. Il recupero fino a questi contrassegni consente di ottenere un set di database consistenti dal punto di vista transazionale. Per la posizione di contrassegni in database correlati, è necessario seguire procedure specifiche.

Il contrassegno viene inserito nel log delle transazioni solo se il database viene aggiornato dalla transazione contrassegnata. Le transazioni che non modificano i dati non sono contrassegnate.

È possibile annidare l'istruzione BEGIN TRAN new_name WITH MARK in una transazione esistente non contrassegnata. In questo modo, new_name diventa il nome di contrassegno della transazione, indipendentemente dall'eventuale nome già assegnato alla transazione. Nell'esempio seguente M2 è il nome del contrassegno.

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

Se si tenta di contrassegnare una transazione già contrassegnata quando si nidificano transazioni, viene visualizzato un messaggio di avviso (non di errore):

BEGIN TRAN T1 WITH MARK

UPDATE table1 ...

BEGIN TRAN M2 WITH MARK

Messaggio 3920, livello 16, stato 1, linea 3

L'opzione WITH MARK viene applicata solo alla prima istruzione BEGIN TRAN WITH MARK.

L'opzione verrà ignorata.

Autorizzazioni

È richiesta l'appartenenza al ruolo public.

Esempi

R. Uso di una transazione esplicita

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure, Azure Synapse Analytics, Parallel Data Warehouse

Questo esempio usa AdventureWorks.

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

B. Rollback di una transazione

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure , Azure Synapse Analytics, Parallel Data Warehouse

Nell'esempio seguente viene illustrato l'effetto del rollback di una transazione. In questo esempio l'istruzione ROLLBACK esegue il rollback dell'istruzione INSERT, ma la tabella creata sarà ancora presente.

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

C. Denominazione di una transazione

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure

Nell'esempio seguente viene illustrato come denominare una transazione.

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. Contrassegno di una transazione

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure

Nell'esempio seguente viene illustrato come contrassegnare una transazione. Viene contrassegnata la transazione CandidateDelete.

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  

Vedi anche

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)