Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: .NET Framework
.NET
.NET Standard
Una transazione è un insieme di attività correlate che, tra le altre cose, ha esito positivo (commit) oppure negativo (abort) come un'unica unità. Una transazione distribuita è una transazione con effetti su varie risorse. Per eseguire il commit di una transazione distribuita è necessario che tutti i partecipanti garantiscano che le eventuali modifiche apportate ai dati siano permanenti. Le modifiche devono essere definitive anche in caso di arresti anomali del sistema o altri eventi imprevisti. Se anche un unico partecipante non è in grado di garantire tale requisito, l'intera transazione verrà annullata e verrà effettuato il rollback di tutte le modifiche apportate ai dati nell'ambito della transazione.
Nota
Per informazioni sulle transazioni distribuite in database SQL di Azure e Istanza gestita di SQL di Azure, vedere Transazioni distribuite tra database cloud.
Lavorare con System.Transactions
In .NET le transazioni distribuite vengono gestite tramite l'API nello spazio dei nomi System.Transactions. L'API System.Transactions delega quindi la gestione della transazione a un monitoraggio delle transazioni, quale Microsoft Distributed Transaction Coordinator (MS DTC), quando sono interessati più gestori di risorse persistenti. Per altre informazioni, vedere Nozioni fondamentali sulle transazioni.
In ADO.NET 2.0 è stato introdotto il supporto per l'inserimento in una transazione distribuita usando il metodo EnlistTransaction, che inserisce una connessione in un'istanza di Transaction. Nelle versioni precedenti di ADO.NET, l'arruolamento esplicito nelle transazioni distribuite veniva effettuato utilizzando il EnlistDistributedTransaction metodo di una connessione per arruolare una connessione in un'istanzaITransaction, supportata per la retrocompatibilità. Per altre informazioni sulle transazioni Enterprise Services, vedere Interoperabilità con transazioni COM+ ed Enterprise Services.
Quando si usa una transazione System.Transactions con il provider di dati Microsoft SqlClient per SQL Server su un database di SQL Server, verrà usato automaticamente un tipo semplice Transaction. La transazione può quindi essere promossa a una piena transazione distribuita in base alle esigenze. Per altre informazioni, vedere Integrazione di System.Transactions con SQL Server.
Partecipazione automatica a una transazione distribuita
L'inserimento automatico è il metodo predefinito e preferenziale per integrare connessioni ADO.NET in System.Transactions. Un oggetto connessione viene automaticamente inserito in una transazione distribuita esistente se viene rilevato che la transazione è attiva. In termini di System.Transaction, questo significa che Transaction.Current non è Null. L'inserimento automatico in una transazione viene eseguito quando si apre la connessione. Dopo di che, ciò non accadrà nemmeno se viene eseguito un comando all'interno di un ambito di transazione. È possibile disabilitare l'integrazione automatica nelle transazioni esistenti specificando Enlist=false come parametro della stringa di connessione per SqlConnection.ConnectionString.
Registrazione manuale in una transazione distribuita
Se l'integrazione automatica è disabilitata o è necessario integrare una transazione avviata dopo l'apertura della connessione, è possibile eseguire l'integrazione in una transazione distribuita esistente usando il metodo EnlistTransaction dell'oggetto SqlConnection per il provider di dati Microsoft SqlClient per SQL Server. La partecipazione a una transazione distribuita esistente garantisce che, se la transazione viene confermata o annullata, anche le modifiche apportate dal codice nell'origine dati verranno confermate o annullate.
Nota
Se si tenta di eseguire il commit o il rollback di una transazione in cui è stato avviato un DataReader mentre la transazione è attiva, verrà generata un'eccezione.
L'adesione a transazioni distribuite è particolarmente indicata quando si gestisce un pool di oggetti business. Se un oggetto business viene inserito in un pool con una connessione aperta, l'arruolamento automatico nella transazione si verifica solo nel momento in cui tale connessione viene aperta. Se vengono eseguite più transazioni utilizzando l'oggetto business nel pool, la connessione aperta per tale oggetto non verrà automaticamente associata alle transazioni avviate successivamente. In questo caso è possibile disabilitare l'inserimento automatico nelle transazioni per la connessione e inserire tale connessione nelle transazioni usando il metodo EnlistTransaction.
EnlistTransaction accetta un solo argomento di tipo Transaction, ovvero un riferimento alla transazione esistente. Dopo la chiamata al metodo EnlistTransaction della connessione, nella transazione sono incluse tutte le modifiche apportate all'origine dati che usa la connessione. Tramite il passaggio di un valore null, la connessione viene rimossa dalla transazione distribuita corrente. Si noti che la connessione deve essere aperta prima di chiamare il metodo EnlistTransaction.
Nota
Una volta che è stata inserita esplicitamente in una transazione, una connessione non può essere rimossa né inserita in una transazione diversa fino a quando non è stata completata la prima transazione.
Attenzione
Il metodo EnlistTransaction genera un'eccezione se la connessione ha già iniziato una transazione usando il metodo BeginTransaction della connessione. Tuttavia, nel caso di una transazione locale avviata nell'origine dati (ad esempio eseguendo in modo esplicito l'istruzione BEGIN TRANSACTION tramite SqlCommand), la chiamata a EnlistTransaction comporterà il rollback della transazione locale e l'inserimento nella transazione distribuita esistente, come richiesto. Non verrà notificato che è stato eseguito il rollback della transazione locale e l'utente dovrà gestire le transazioni locali non avviate tramite il metodo BeginTransaction. Se si usa il provider di dati Microsoft SqlClient per SQL Server con SQL Server, un tentativo di integrazione genererà un'eccezione. Tutti gli altri casi non verranno rilevati.
Transazioni promuovibili in SQL Server
SQL Server supporta transazioni promuovibili in cui una transazione semplice locale può essere automaticamente promossa a transazione distribuita soltanto nel caso in cui ciò sia richiesto. Una transazione promuovibile non comporta il sovraccarico aggiuntivo di una transazione distribuita, a meno che tale sovraccarico non sia necessario. Per altre informazioni e un esempio di codice, vedere Integrazione di System.Transactions con SQL Server.
Configurazione di transazioni distribuite
Può essere necessario abilitare MS DTC sulla rete per usare le transazioni distribuite. Se Windows Firewall è abilitato, è necessario consentire al servizio MS DTC di usare la rete o aprire la porta MS DTC.