Transazioni distribuite (ADO.NET)

Una transazione consiste in una set di attività correlate che costituiscono una singola unità, la quale può riuscire (ovvero viene eseguito il commit della transazione) o non riuscire (il processo viene interrotto). Una transazione distribuita influenza 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.

NotaNota

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.

Utilizzo di System.Transactions

In .NET Framework, 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 ulteriori informazioni, vedere Transaction Fundamentals.

In ADO.NET 2.0 è stato introdotto il supporto per l'inserimento in una transazione distribuita utilizzando il metodo EnlistTransaction, che inserisce una connessione in un'istanza di Transaction. Nelle versioni precedenti di ADO.NET l'inserimento esplicito nelle transazioni distribuite veniva eseguito tramite il metodo EnlistDistributedTransaction di una connessione per inserire una connessione in un'istanza di ITransaction, che è supportata per la compatibilità con le versioni precedenti. Per ulteriori informazioni sulle transazioni Enterprise Services, vedere Interoperability with Enterprise Services and COM+ Transactions.

Quando si utilizza una transazione System.Transactions con il provider .NET Framework per SQL Server con un database SQL Server 2005, viene utilizzato automaticamente un tipo semplice Transaction. La transazione può quindi essere promossa a una piena transazione distribuita in base alle esigenze. Per ulteriori informazioni, vedere Integrazione di System.Transactions con SQL Server (ADO.NET).

NotaNota

Il numero massimo di transazioni distribuite cui un database Oracle può partecipare contemporaneamente è impostato su 10 per impostazione predefinita.Dopo la decima transazione con una connessione a un database Oracle, viene generata un'eccezione.Oracle non supporta DDL in una transazione distribuita.

Inserimento automatico in 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. Successivamente, l'inserimento non viene più eseguito, neanche nel caso in cui venga eseguito un comando nell'ambito di una transazione. È possibile disabilitare l'inserimento automatico nelle transazioni esistenti specificando Enlist=false come parametro della stringa di connessione per una proprietà ConnectionString oppure OLE DB Services=-7 come parametro della stringa di connessione per una proprietà ConnectionString. Per ulteriori informazioni sui parametri della stringa di connessione Oracle e ODBC, vedere ConnectionString e ConnectionString.

Inserimento manuale in una transazione distribuita

Se l'inserimento automatico è disabilitato o se è necessario inserire una transazione che è stata avviata dopo l'apertura della connessione, è possibile effettuare l'inserimento in una transazione distribuita utilizzando il metodo EnlistTransaction dell'oggetto DbConnection per il provider in uso. L'inserimento in una transazione distribuita esistente assicura che se viene eseguito il commit o il rollback della transazione, verrà eseguito il commit o, rispettivamente, il rollback anche delle modifiche apportate dal codice all'origine dati.

L'inserimento in transazioni distribuite è particolarmente indicato quando si effettua il pool di oggetti business. Se si effettua il pool di un oggetto business con una connessione aperta, l'inserimento automatico nella transazione verrà eseguito solo quando quella connessione è aperta. Se vengono condotte più transazioni utilizzando l'oggetto business di cui si effettua il pool, la connessione aperta per tale oggetto non verrà automaticamente inserita nelle nuove transazioni. In questo caso è possibile disabilitare l'inserimento automatico nelle transazioni per la connessione e inserire tale connessione nelle transazioni utilizzando il metodo EnlistTransaction.

Il metodo 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 utilizza 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.

NotaNota

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.

Nota di avvisoAttenzione

Il metodo EnlistTransaction genera un'eccezione se la connessione ha già iniziato una transazione utilizzando 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 utilizza il provider di dati .NET Framework per SQL Server (SqlClient) con SQL Server 2005, un tentativo di inserimento genererà un'eccezione.Tutti gli altri casi non verranno rilevati.

Transazioni promuovibili in SQL Server 2005

SQL Server 2005 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 richiama il sovraccarico aggiunto di una transazione distribuita a meno che il sovraccarico aggiunto non sia richiesto. Per ulteriori informazioni e un esempio di codice, vedere Integrazione di System.Transactions con SQL Server (ADO.NET).

Configurazione di transazioni distribuite

Può essere necessario abilitare MS DTC sulla rete per utilizzare le transazioni distribuite se si utilizza un nuovo sistema operativo con i service pack più recenti applicati, ad esempio Windows XP o Windows Server 2003. Se Windows Firewall è abilitato (impostazione predefinita per Windows XP Service Pack 2), è necessario consentire al servizio MS DTC di utilizzare la rete o aprire la porta MS DTC.

Vedere anche

Concetti

Integrazione di System.Transactions con SQL Server (ADO.NET)

Altre risorse

Transazioni e concorrenza (ADO.NET)