Query distribuite e transazioni distribuite
Motore di database di SQL Server consente di creare collegamenti a origini dati OLE DB denominati server collegati. Dopo avere stabilito il collegamento con un'origine dati OLE DB, è possibile eseguire le operazioni seguenti:
Fare riferimento a righe di dati delle origini dati OLE DB come tabelle in istruzioni Transact-SQL.
- Passare comandi alle origini dati OLE DB e includere i set di righe risultanti come tabelle in istruzioni Transact-SQL.
In ogni query distribuita è possibile fare riferimento a più server collegati ed eseguire operazioni di aggiornamento o lettura su ogni singolo server collegato. Una query distribuita può eseguire operazioni di lettura su alcuni server collegati e operazioni di aggiornamento su altri server collegati. In generale, quando è probabile che in una transazione vengano aggiornati i dati di più server collegati, Motore di database richiede al provider OLE DB corrispondente il supporto delle transazioni distribuite. Di conseguenza, i tipi di query di cui è supportata l'esecuzione nei server collegati variano in base al livello di supporto per le transazioni disponibile nei provider OLE DB. In OLE DB vengono definite due interfacce facoltative per la gestione delle transazioni:
- ITransactionLocal, che supporta le transazioni locali nell'origine dati OLE DB.
- ITransactionJoin, che consente al provider di partecipare a una transazione distribuita in cui sono disponibili altri gestori delle risorse.
I provider che supportano l'interfaccia ITransactionJoin supportano anche l'interfaccia ITransactionLocal.
Se una query distribuita viene eseguita in modalità autocommit, vengono applicate le regole seguenti:
- Per i provider che non supportano l'interfaccia ITransactionLocal sono consentite solo operazioni di lettura.
- Per i provider che supportano l'interfaccia ITransactionLocal sono consentite tutte le operazioni di aggiornamento.
L'istanza di controllo di Motore di database chiama automaticamente l'interfaccia ITransactionLocal in ogni server collegato che partecipa a un'operazione di aggiornamento per avviare una transazione locale. Quando l'istruzione ha esito positivo, viene eseguito il commit, altrimenti viene eseguito il rollback.
Se una query distribuita viene eseguita su una vista partizionata distribuita oppure quando nella connessione è attiva una transazione esplicita o implicita, vengono applicate le regole seguenti:
- Per i provider che non supportano l'interfaccia ITransactionJoin sono consentite solo le operazioni di lettura. Per i provider che non supportano alcuna transazione oppure supportano solo l'interfaccia ITransactionLocal non è consentita alcuna operazione di aggiornamento.
- Se l'opzione SET XACT_ABORT è impostata su ON, sono consentite tutte le operazioni di aggiornamento sui provider che supportano l'interfaccia ITransactionJoin. L'istanza di controllo di Motore di database chiama automaticamente ITransactionJoin in ogni server collegato che partecipa a un'operazione di aggiornamento per registrarlo nella transazione distribuita. Quando il server di controllo segnala che per la transazione è stato eseguito il commit o il rollback, Microsoft Distributed Transaction Coordinator (MS DTC) esegue il commit o il rollback.
- Se l'opzione SET XACT_ABORT è impostata su OFF, le operazioni di aggiornamento sono consentite solo se il server collegato supporta anche le transazioni nidificate. Le transazioni nidificate sono supportate se il provider supporta la chiamata di ITransactionLocal::StartTransaction quando esiste almeno una transazione per la sessione corrente. Ciò consente in SQL Server l'esecuzione del rollback di singole istruzioni all'interno di query distribuite senza eseguire il rollback dell'intera transazione.
Le regole precedenti implicano una restrizione per i provider che non supportano le transazioni nidificate: le operazioni di aggiornamento sono consentite in una transazione distribuita solo se l'opzione XACT_ABORT è impostata su ON.