2009-12-31 6 views
3

Considérons ce scénario; supposons que j'ai une fenêtre WPF qui a quatre objets liés à ses contrôles (Schedule, Customer, Contract, ScheduleDetails et Signer spécifiquement) qui représentent quatre tables de base de données dans la base de données backend. Je veux quand la demande de l'utilisateur enregistrer pour l'information qu'il/elle a entré pour être joint dans l'opération d'atome dans d'autres mots toutes les opérations de sauvegarde soient dans une transaction ainsi toutes les opérations réussissent ou toutes échouent. Ma question est quelle est la manière la plus efficace pour représenter le fonctionnement des transactions dans ce scénarioComment enregistrer dans la transaction?

Répondre

4

Le le plus efficace est d'utiliser BeginTransaction etc sur votre DbConnection, mais cela ne convient pas, comme vous devez utiliser la même connexion, et chaque DbCommand a besoin du transaction réglage etc.

le plus simple est TransactionScope, et si vous êtes sur SQL Server 2005 ou au-dessus, vous remarquerez rarement une différence significative de performance entre ceci et BeginTransaction:

using(var tran = new TransactionScope()) { 
    SaveA(); 
    SaveB(); 
    SaveC(); 
    SaveD(); 
    tran.Complete(); 
} 

Ici, il n'a pas d'importance si SaveA etc utiliser la même connexion, comme SqlConnection solliciterons dans un TransactionScope automatiquement.

Alternativement, laissez un ORM gérer ceci pour vous; la plupart vont créer des transactions pour enregistrer un groupe de modifications.

Une chose à regarder; TransactionScope repose sur des services (DTC) qui peuvent ne pas être disponibles sur tous les clients (puisque vous mentionnez WPF, qui est côté client).

+1

Si vous utilisez TransactionScope, assurez-vous que le service DTC - Distributed Transaction Coordinator fonctionne sur votre machine cible, sinon vous obtiendrez des exceptions. –

+0

@Chris - Je viens d'éditer pour exactement cela ;-p –

+1

@ Mark, Merci. Mais il y a une relation entre DTC et la classe Transaction - je ne me souviens pas quand il s'agit de l'image - mais je veux éviter le surcoût d'utiliser DTC, même si j'aime la forme simple de la classe Transaction. Y at-il un moyen de ne pas être enrôlé dans une transaction DTC? –

Questions connexes