Transazioni distribuite Transact-SQL
La struttura delle transazioni distribuite avviate in Transact-SQL è relativamente semplice:
Una connessione di applicazione o script Transact-SQL esegue un'istruzione Transact-SQL che avvia una transazione distribuita.
L'istanza di Motore di database di SQL Server che esegue l'istruzione diventa il server di controllo della transazione.
Lo script o l'applicazione esegue quindi le query distribuite su server collegati o le stored procedure remote su server remoti.
In seguito alla chiamata di query distribuite e procedure remote, il server di controllo chiama automaticamente Microsoft Distributed Transaction Coordinator (MS DTC) per integrare i server collegati e remoti nella transazione distribuita.
Quando lo script o l'applicazione esegue un'istruzione COMMIT o ROLLBACK, l'istanza di controllo di SQL Server chiama MS DTC per gestire il processo di commit in due fasi o per richiedere ai server collegati e remoti l'esecuzione del rollback delle rispettive transazioni.
Istruzioni Transact-SQL necessarie
Il numero di istruzioni Transact-SQL che controllano le transazioni distribuite è relativamente ridotto, in quando la maggior parte delle operazioni vengono eseguite internamente da Motore di database di SQL Server e MS DTC. Le uniche istruzioni Transact-SQL necessarie nell'applicazione o nello script Transact-SQL sono quelle necessarie per eseguire le operazioni seguenti:
Avviare una transazione distribuita.
Eseguire query distribuite sui server collegati o eseguire procedure remote sui server remoti.
Chiamare le istruzioni Transact-SQL standard COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION o ROLLBACK WORK per completare la transazione.
Per qualsiasi transazione distribuita Transact-SQL, l'istanza di Motore di database che elabora lo script o la connessione Transact-SQL chiama automaticamente MS DTC per coordinare il commit o il rollback della transazione.
Avvio di transazioni distribuite
È possibile avviare le transazioni distribuite in Transact-SQL nei modi seguenti:
Avviare una transazione distribuita esplicita tramite l'istruzione BEGIN DISTRIBUTED TRANSACTION.
È inoltre possibile eseguire una query distribuita su un server collegato. L'istanza di Motore di database a cui si è connessi chiama MS DTC per la gestione della transazione distribuita con il server collegato. Nell'ambito della transazione distribuita è inoltre possibile chiamare stored procedure remote in un'istanza remota di Motore di database.
Eseguire una query distribuita durante una transazione locale.
Se l'origine dei dati OLE DB supporta l'interfaccia ITransactionJoin, la transazione viene promossa automaticamente a transazione distribuita anche se la query è di sola lettura. Se l'origine dei dati non supporta ITransactionJoin, sono consentite solo istruzioni di sola lettura.
Se è stata eseguita l'istruzione SET REMOTE_PROC_TRANSACTIONS ON e una transazione locale chiama una stored procedure remota in un'altra istanza di Motore di database, la transazione locale viene promossa automaticamente a transazione distribuita.
In Motore di database il coordinamento della transazione con il server remoto viene eseguito tramite MS DTC. Se l'opzione REMOTE_PROC_TRANSACTIONS è impostata su OFF, le chiamate delle stored procedure remote vengono eseguite all'esterno dell'ambito di una transazione locale. Il rollback della transazione locale non comporta il rollback delle operazioni eseguite dalla procedura remota. Il commit di tali operazioni viene eseguito al completamento della procedura, non in seguito al commit della transazione locale.
L'opzione REMOTE_PROC_TRANSACTIONS è disponibile per compatibilità con le versioni precedenti e ha effetto solo sulle chiamate di stored procedure remote indirizzate a server remoti che sono stati definiti tramite sp_addserver. L'opzione non viene applicata alle query distribuite che eseguono una stored procedure in un server collegato definito tramite sp_addlinkedserver. Per ulteriori informazioni sulle query distribuite, vedere Query distribuite.