Condividi tramite


BEGIN TRANSACTION (Transact-SQL)

Contrassegna il punto di inizio di una transazione locale esplicita. L'istruzione BEGIN TRANSACTION incrementa la funzione @@TRANCOUNT di una unità.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • transaction_name
    Nome assegnato alla transazione. transaction_name deve essere conforme alle regole per gli identificatori, ma non è possibile utilizzare 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.

  • @tran\_name\_variable
    Nome di una variabile definita dall'utente contenente un nome di transazione valido. La variabile deve essere dichiarata con il 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' ]
    Viene specificato che la transazione è contrassegnata nel log. description è una stringa mediante la quale viene descritto il contrassegno. Se description include più di 128 caratteri, viene troncata a 128 caratteri prima di essere archiviata 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

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 utilizzato 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 utilizza 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 ulteriori 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 ulteriori 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 ulteriori informazioni, vedere Utilizzare 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 nidificare 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

A.Denominazione di una transazione

Nell'esempio seguente viene illustrato come denominare una transazione.

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

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

COMMIT TRANSACTION @TranName;
GO

B.Contrassegno di una transazione

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 AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO

Vedere anche

Riferimento

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)