3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>
La classe TransactionScope
Oltre alle transazioni ADO.NET, il .NET Framework dalla versione 2.0 include una serie di classi raccolte nel namespace System.Transactions (a cui corrisponde un assembly omonimo) pensate per gestire le transazioni distribuite. Tra queste la classe TransactionScope permette di rendere transazionale un insieme di operazioni eseguite su database diversi utilizzando connessioni differenti.
A differenza di quanto visto per le transazioni ADO.NET, con TransactionScope non è necessario specificare l'inizio della transazione, né tantomeno specificare l'invocazione del metodo Rollback(). L'unica cosa di cui ci dobbiamo preoccupare è di chiamare il metodo Complete() al termine dell'esecuzione delle nostre operazioni sui dati, come mostrato nel codice seguente:
using(TransactionScope ts = new TransactionScope())
{
// Eseguo le operazioni su database.
// ...
// ...
// ...
ts.Complete();
}
Se il codice presente all'interno del blocco using va a buon fine, l'operazione Complete() rende permanenti le modifiche fatte (commit); al contrario, nel caso in cui si verifichi un'eccezione, viene automaticamente invocato il rollback dal gestore delle transazioni.
Come è facilmente intuibile, il metodo Complete() deve essere l'ultima operazione effettuata prima della chiusura del blocco using. Non essendo presente il metodo RollBack(), per annullare la transazione e ripristinare lo stato iniziale è sufficiente non invocare il metodo Complete().
Gli oggetti di tipo TransactionScope possono essere istanziati secondo modalità diverse definite dall'enumerazione System.Transactions.TransactionScopeOption che permette di specificare come le transazioni di ambiente devono essere create. I valori possibili sono:
- Required: crea una nuova transazione di ambiente nel caso in cui non ne esista una;
- RequiredNew: crea una nuova transazione di ambiente in ogni caso, anche se ne esistono già;
- Suppress: non crea nessuna transazione e non partecipa alle transazioni esistenti.
Le opzioni elencate vengono specificate in fase di costruzione di una istanza della classe TransactionScope. Nel caso in cui al costruttore non venga passato alcun valore, viene creata una nuova transazione di ambiente qualora non ne esista già una (Required).
E' interessante notare come diversi oggetti di tipo TransactionScope possano essere annidati tra loro, in funzione delle opzioni impostate in fase di costruzione. In generale, un oggetto TransactionScope può contenere altre istanze dello stesso tipo, a meno che non vengano specificate le opzioni RequiresNew o Suppress. L'esempio seguente mostra un semplice caso di annidamento:
using(TransactionScope ts1 = new TransactionScope())
{
using(TransactionScope ts2 =
new TransactionScope(TransactionScopeOption.Required))
{
}
using(TransactionScope ts3 =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
}
using(TransactionScope ts4 =
new TransactionScope(TransactionScopeOption.Suppress))
{
}
}

Nell'esempio il primo TransactionScope ts1, non avendo alcuna opzione impostata sul costruttore, crea una nuova transazione di ambiente. L'istanza ts2, avendo impostato la stessa opzione di ts1, entra a far parte dello stesso contesto transazionale, mentre ts3 crea una nuova transazione di ambiente totalmente scollegata dalle due precedenti; infine ts4 non partecipa a nessuna delle transazioni di ambiente definite. In questo modo, se le transazioni ts3 o ts4 non vanno a buon fine, ts1 e ts2 possono comunque essere completate normalmente.
La tabella seguente mostra il comportamento di ogni opzione nel caso sia già stata definita o meno una transazione di ambiente:
| TransactionScopeOption | Transazione di ambiente | Comportamento |
| Required | No | Crea una nuova transazione di ambiente |
| RequiredNew | No | Crea una nuova transazione di ambiente |
| Suppress | No | Non crea nessuna transazione di ambiente |
| Required | Si | Utilizza la transazione di ambiente già esistente |
| RequiredNew | Si | Crea una nuova transazione di ambiente |
| Suppress | Si | Non crea nessuna transazione di ambiente |
Uno dei vantaggi maggiori di TransactionScope è rappresentato dal fatto che offre la possibilità di rendere transazionali operazioni su dati raggiunti contemporaneamente tramite connessioni distribuite su diverse tipologie di database (Oracle, SQL Server, sorgenti OleDb, ecc.), sfruttando il DTC (Distribuited Transaction Coordinator) di Windows.
Purtroppo non tutti gli hosting provider, per motivi di sicurezza o policy interne, offrono la possibilità di utilizzare TransactionScope. In questi casi sta a noi creare una classe che ci permetta di gestire una transazione tra più oggetti in modo indipendente, senza richiedere particolari interventi dell'amministratore di sistema.
3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Galleria fotografica dinamica con ASP.NET AJAX
- Usare Search come un servizio nei tuoi siti e nei tuoi client
- Mappe nel tuo sito con Virtual Earth
- Integrare Windows Live ID, Contacts e Presence API nelle tue applicazioni
- Introduzione ai cloud based service con Windows Live Services
- Realizzare un custom extender AJAX con ASP.NET 3.5
- Tracciare le modifiche ai dati e allineare i datawarehouse con il Change Data Capture in SQL Server 2008
- Le nuove caratteristiche di IIS 7.0 per sviluppatori e sistemisti
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.






Difficoltà
Utilità
Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
