Share via


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 relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure.

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

Sintassi per Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Analytics Platform System (PDW).

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 e Istanza gestita di SQL di Azure

Nome assegnato alla transazione. transaction_name deve essere conforme alle regole per gli identificatori, ma gli identificatori di lunghezza superiore a 32 caratteri non sono consentiti. Usare i nomi delle transazioni solo nella coppia più esterna di istruzioni o BEGIN...ROLLBACK annidateBEGIN...COMMIT. transaction_name fa sempre distinzione tra maiuscole e minuscole, anche quando l'istanza di SQL Server non fa distinzione tra maiuscole e minuscole.

@tran_name_variable

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure e Istanza gestita di 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, vengono usati solo i primi 32 caratteri. I caratteri rimanenti vengono troncati.

WITH MARK [ 'description' ]

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

Viene specificato che la transazione è contrassegnata nel log. description è una stringa che descrive il contrassegno. Una descrizione più lunga di 128 caratteri viene troncata a 128 caratteri prima di essere archiviata nella msdb.dbo.logmarkhistory tabella.

Se WITH MARK viene utilizzato, è necessario specificare un nome di transazione. WITH MARK consente di ripristinare un log delle transazioni in un contrassegno denominato.

Osservazioni:

BEGIN TRANSACTION incrementa di @@TRANCOUNT1.

BEGIN TRANSACTION rappresenta un punto in cui i dati a cui fa riferimento una connessione sono coerenti logicamente e fisicamente. Se vengono rilevati errori, tutte le modifiche apportate ai dati dopo il BEGIN TRANSACTION rollback di possono restituire i dati a questo stato noto di coerenza. Ogni transazione dura fino a quando non viene completata senza errori e COMMIT TRANSACTION viene emessa per apportare le modifiche una parte permanente del database oppure vengono rilevati errori e tutte le modifiche vengono cancellate con un'istruzione ROLLBACK TRANSACTION .

BEGIN TRANSACTION avvia una transazione locale per la connessione che esegue l'istruzione . A seconda delle impostazioni correnti del livello di isolamento delle transazioni, molte risorse acquisite per supportare le istruzioni Transact-SQL rilasciate dalla connessione vengono bloccate dalla transazione finché non viene completata 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.

Anche se BEGIN TRANSACTION avvia una transazione locale, non viene registrata nel log delle transazioni fino a quando l'applicazione non esegue un'azione che deve essere registrata nel log, ad esempio l'esecuzione di un'istruzione INSERT, UPDATEo DELETE . Un'applicazione può eseguire azioni come l'acquisizione di blocchi per proteggere il livello di isolamento delle transazioni delle SELECT istruzioni, ma non viene registrato nulla nel log fino a quando l'applicazione non esegue un'azione 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 inoltrata a una transazione distribuita se le azioni seguenti vengono eseguite prima del commit o del rollback dell'istruzione:

  • Viene eseguita un'istruzione INSERT, DELETEo UPDATE che fa riferimento a una tabella remota in un server collegato. L'istruzione INSERT, UPDATEo DELETE non riesce se il provider OLE DB usato per accedere al server collegato non supporta l'interfaccia ITransactionJoin .

  • Viene eseguita 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.

Una transazione può essere eseguita in modo esplicito come transazione distribuita tramite BEGIN DISTRIBUTED TRANSACTION. Per altre informazioni, vedere BEGIN DISTRIBUTED TRANSACTION.

Quando SET IMPLICIT_TRANSACTIONS è impostato su ON, un'istruzione BEGIN TRANSACTION crea due transazioni annidate. Per altre informazioni, vedere SET IMPLICIT_TRANSACTIONS.

Transazioni contrassegnate

L'opzione WITH MARK fa sì che il nome della transazione venga inserito nel log delle transazioni. Quando si ripristina uno stato precedente di un database, la transazione contrassegnata può essere usata al posto di una data e un'ora. Per altre informazioni, vedere Usare transazioni contrassegnate per recuperare i database correlati in modo coerente e istruzioni RESTORE.

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.

BEGIN TRANSACTION <new_name> WITH MARK può essere annidato all'interno di una transazione già esistente che non è contrassegnata. In questo caso, <new_name> diventa il nome del contrassegno per la transazione, nonostante il nome che potrebbe essere già stato 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;

Quando si annidano le transazioni, viene visualizzato il messaggio di avviso seguente se si tenta di contrassegnare una transazione già contrassegnata:

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.

Autorizzazioni

È richiesta l'appartenenza al ruolo public .

Esempi

Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.

R. Usare una transazione esplicita

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure, Azure Synapse Analytics, Piattaforma di analisi (PDW)

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, Istanza gestita di SQL di Azure, Azure Synapse Analytics, Piattaforma di analisi (PDW)

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 esiste ancora.

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

C. Assegnare un nome a una transazione

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure, Istanza gestita di 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. Contrassegnare una transazione

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure, Istanza gestita di 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