Condividi tramite


BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

Contrassegna il punto di inizio di una transazione distribuita Transact-SQL gestita da Microsoft Distributed Transaction Coordinator (MS DTC).

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

BEGIN DISTRIBUTED { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable ] 
[ ; ]

Argomenti

  • transaction_name
    Nome di transazione definito dall'utente e utilizzato per tenere traccia della transazione distribuita nelle utilità MS DTC. transaction_name deve essere conforme alle regole per gli identificatori e deve rispettare il limite <= 32 per il numero di caratteri.

  • @tran\_name\_variable
    Nome di una variabile definita dall'utente contenente un nome di transazione utilizzato per tenere traccia della transazione distribuita nelle utilità MS DTC. La variabile deve essere dichiarata con il tipo di dati char, varchar, nchar o nvarchar.

Osservazioni

L'istanza di Motore di database di SQL Server in cui viene eseguita l'istruzione BEGIN DISTRIBUTED TRANSACTION è l'origine della transazione e controlla il completamento della transazione. Quando viene successivamente eseguita un'istruzione COMMIT TRANSACTION o ROLLBACK TRANSACTION per la sessione, l'istanza di controllo richiede che il completamento della transazione distribuita in tutte le istanze coinvolte venga gestito da MS DTC.

L'isolamento dello snapshot a livello di transazione non supporta le transazioni distribuite. Per ulteriori informazioni, vedere Utilizzo di livelli di isolamento basati sul controllo delle versioni delle righe.

L'integrazione di istanze remote di Motore di database in una transazione distribuita in genere avviene quando una sessione già integrata nella transazione distribuita esegue una query distribuita in cui viene fatto riferimento a un server collegato.

Se, ad esempio, l'istruzione BEGIN DISTRIBUTED TRANSACTION viene eseguita nel ServerA, la sessione chiama una stored procedure nel ServerB e un'altra stored procedure nel ServerC. La stored procedure nel ServerC esegue una query distribuita sul ServerD e quindi nella transazione distribuita vengono coinvolti tutti i quattro computer. L'istanza di Motore di database nel ServerA è l'istanza di origine e di controllo della transazione.

Le sessioni coinvolte in transazioni distribuite Transact-SQL non ottengono un oggetto transazione passabile a un'altra sessione per l'integrazione esplicita nella transazione distribuita. L'unico modo per consentire l'integrazione di un server remoto nella transazione consiste nell'utilizzare il server come destinazione di una chiamata di stored procedure remota o di una query distribuita.

Quando una query distribuita viene eseguita in una transazione locale, la transazione viene promossa automaticamente a una transazione distribuita se l'origine dei dati OLE DB di destinazione supporta ITransactionLocal. Se l'origine dei dati OLE DB di destinazione non supporta ITransactionLocal, nella query distribuita è possibile eseguire solo operazioni di lettura.

Una sessione già integrata nella transazione distribuita esegue una chiamata di stored procedure remota in cui viene fatto riferimento a un server remoto.

L'opzione sp_configure remote proc trans determina se le chiamate di stored procedure remote in una transazione locale causano automaticamente la promozione della transazione locale a una transazione distribuita gestita da MS DTC. È possibile utilizzare l'opzione SET REMOTE_PROC_TRANSACTIONS a livello di connessione per ignorare l'impostazione predefinita dell'istanza specificata da sp_configure remote proc trans. Quando si attiva questa opzione, una chiamata di stored procedure remota causa la promozione di una transazione locale a una transazione distribuita. La connessione in cui viene creata la transazione MS DTC diventa l'origine della transazione. L'istruzione COMMIT TRANSACTION avvia un'operazione di commit coordinata da MS DTC. Se l'opzione sp_configure remote proc trans è impostata su ON, le chiamate di stored procedure remote eseguite in transazioni locali vengono protette automaticamente come parte di transazioni distribuite senza che sia necessario riprogrammare le applicazioni in modo che eseguano l'istruzione BEGIN DISTRIBUTED TRANSACTION anziché l'istruzione BEGIN TRANSACTION.

Per ulteriori informazioni sull'ambiente e sul processo delle transazioni distribuite, vedere la documentazione di Microsoft Distributed Transaction Coordinator.

Autorizzazioni

È richiesta l'appartenenza al ruolo public.

Esempi

In questo esempio viene eliminato un candidato dal database AdventureWorks sia nell'istanza locale di Motore di database che in un'istanza in un server remoto. Entrambi i database eseguiranno il commit o il rollback della transazione.

[!NOTA]

Se nel computer che esegue l'istanza di Motore di database non è installato MS DTC, in questo esempio viene visualizzato un messaggio di errore. Per ulteriori informazioni sull'installazione di MS DTC, vedere la documentazione di Microsoft Distributed Transaction Coordinator.

USE AdventureWorks;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO