Il existe 2 principaux types de transactions; transactions de connexion et transactions ambiantes. Une transaction de connexion (telle que SqlTransaction) est directement liée à la connexion db (telle que SqlConnection), ce qui signifie que vous devez continuer à transmettre la connexion - OK dans certains cas, mais n'autorise pas «créer / utiliser / libérer» utilisation, et ne permet pas le travail cross-db. Un exemple (formaté pour l'espace):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Pas trop compliqué, mais limité à notre connexion "conn". Si nous voulons faire appel à différentes méthodes, nous devons maintenant passer "conn".
L'alternative est une transaction ambiante; nouveau dans .NET 2.0, l' objet TransactionScope (System.Transactions.dll) permet une utilisation sur une plage d'opérations (les fournisseurs appropriés s'enrôleront automatiquement dans la transaction ambiante). Cela facilite la rétro-intégration dans le code existant (non transactionnel) et la conversation avec plusieurs fournisseurs (bien que DTC soit impliqué si vous en parlez à plus d'un).
Par exemple:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Notez ici que les deux méthodes peuvent gérer leurs propres connexions (ouvrir / utiliser / fermer / éliminer), mais elles feront silencieusement partie de la transaction ambiante sans que nous ayons à passer quoi que ce soit.
Si vos erreurs de code, Dispose () sera appelé sans Complete (), il sera donc annulé. L'imbrication attendue, etc. est prise en charge, bien que vous ne puissiez pas annuler une transaction interne mais terminer la transaction externe: si quelqu'un n'est pas satisfait, la transaction est annulée.
L'autre avantage de TransactionScope est qu'il n'est pas uniquement lié aux bases de données; tout fournisseur prenant en charge les transactions peut l'utiliser. WCF, par exemple. Ou il existe même des modèles d'objets compatibles avec TransactionScope (c'est-à-dire des classes .NET avec capacité de restauration - peut-être plus facile qu'un souvenir, même si je n'ai jamais utilisé cette approche moi-même).
Dans l'ensemble, un objet très, très utile.
Quelques mises en garde:
- Sur SQL Server 2000, un TransactionScope ira immédiatement au DTC; ceci est corrigé dans SQL Server 2005 et au-dessus, il peut utiliser le LTM (beaucoup moins de surcharge) jusqu'à ce que vous parliez à 2 sources, etc., quand il est élevé au DTC.
- Il y a un problème qui signifie que vous devrez peut-être modifier votre chaîne de connexion