Esistono 2 tipi principali di transazioni; transazioni di connessione e transazioni ambientali. Una transazione di connessione (come SqlTransaction) è collegata direttamente alla connessione db (come SqlConnection), il che significa che devi continuare a passare la connessione in giro - OK in alcuni casi, ma non consente "crea / usa / rilascia" utilizzo e non consente il lavoro cross-db. Un esempio (formattato per lo spazio):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Non troppo disordinato, ma limitato alla nostra connessione "conn". Se vogliamo chiamare diversi metodi, ora dobbiamo passare "conn" in giro.
L'alternativa è una transazione ambientale; nuovo in .NET 2.0, l' oggetto TransactionScope (System.Transactions.dll) consente l'utilizzo in una serie di operazioni (i provider adatti verranno automaticamente inclusi nella transazione ambientale). Ciò consente di adattarsi facilmente al codice esistente (non transazionale) e di parlare con più provider (anche se DTC verrà coinvolto se si parla con più di uno).
Per esempio:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Nota qui che i due metodi possono gestire le proprie connessioni (open / use / close / dispose), ma entreranno silenziosamente a far parte della transazione ambientale senza che dobbiamo passare nulla.
Se i tuoi errori di codice, Dispose () verrà chiamato senza Complete (), quindi verrà eseguito il rollback. L'annidamento previsto ecc è supportato, sebbene non sia possibile ripristinare una transazione interna ma completare la transazione esterna: se qualcuno non è soddisfatto, la transazione viene interrotta.
L'altro vantaggio di TransactionScope è che non è legato solo ai database; qualsiasi fornitore consapevole delle transazioni può utilizzarlo. WCF, per esempio. Oppure ci sono anche alcuni modelli di oggetti compatibili con TransactionScope (ad esempio classi .NET con funzionalità di rollback - forse più facile di un ricordo, anche se non ho mai usato questo approccio da solo).
Tutto sommato, un oggetto molto, molto utile.
Alcuni avvertimenti:
- Su SQL Server 2000, TransactionScope passerà immediatamente a DTC; questo è stato risolto in SQL Server 2005 e versioni successive, può utilizzare LTM (molto meno overhead) fino a quando non si parla con 2 origini ecc., quando viene elevato a DTC.
- C'è un problema tecnico che significa che potrebbe essere necessario modificare la stringa di connessione