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à.
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' ]
Specifica che la transazione è contrassegnata nel log. description è una stringa che descrive il contrassegno. Se description contiene una stringa Unicode, i valori composti da più di 255 caratteri vengono troncati a tale limite prima di essere archiviati nella tabella msdb.dbo.logmarkhistory. Se description contiene una stringa non Unicode, i valori composti da più di 510 caratteri vengono troncati a tale limite.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).
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 Utilizzo delle transazioni contrassegnate (modello di recupero con registrazione completa) e RESTORE (Transact-SQL).
I contrassegni del log delle transazioni sono inoltre necessari quando si desidera ripristinare 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 ripristino fino a questi contrassegni consente di ottenere un set di database consistenti dal punto di vista transazionale. Per l'inserimento 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 AdventureWorks;
DELETE FROM AdventureWorks.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 AdventureWorks;
GO
DELETE FROM AdventureWorks.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO
Vedere anche