2010-07-27 22 views
0

Bonjour à tous,Comment puis-je forcer TransactionScope à utiliser la même connexion à travers les appels de base de données?

J'ai un code similaire aux suivantes

try{ 
    using(var tx = new TransactionScope()){ 

     var Xupdated = someDao.DoSomeUpdateQuery(); //this dao uses MS Data ApplicationBlock 

     var Yupdated = someDao.DoSomeOtherUpdateQuery(); //this dao also uses MS Data ApplicationBlock 

    if(Xupdated && Yupdated) 
    { 
     tx.Complete(); 
    } 

    } 
} catch(Exception ex){ 

    DoSomethingWithTheException(); 
} 

Les méthodes dao ont un code comme celui-ci

try{ 
var db = DatabaseFactory.CreateDatabase(); 
var cmd = db.GetStoredProcCommand(someSP); 
    var retVal = db.ExecuteNonQuery(cmd); 
return (retVal > 0); 
} catch (SqlException ex){ 
    CustomException custom = new CustomException(ex.Message, ex); 
    throw custom; 

}

Le problème est ici quand « Yupdated 'retourne false, je veux que' DoSomeUpdateQuery() 'soit annulé. Malheureusement, les modifications 'DoSomeUpdateQuery()' sont validées. Comment puis-je remédier à cela? Je mets un point d'arrêt dans et tx.Complete() n'est jamais appelé. Est-ce que quelqu'un sait comment je peux obtenir le comportement désiré approprié ici? Merci d'avance pour les pointeurs.

Cheers,
~ ck à San Diego

Répondre

0

Vous avez déjà le comportement approprié tant que la classe DatabaseFactory, quoi que ce soit, se comporte de manière à coopérer. Si les appels someDao semblent agir indépendamment, cela peut signifier qu'ils créent activement une portée interne avec TranscationScopeOption.Supress. Un autre problème pourrait être si l'appel CreateDatabase cache en interne SqlConnection et ne repose pas sur le pool de connexion SqlClient, en contournant ainsi éventuellement l'inscription de connexion dans la transaction. En même temps, même si cela fonctionne comme vous le souhaitez, il sera très inefficace car vous inscrirez deux connexions distinctes dans une transaction distribuée et cela ralentira le traitement d'un accord great. Une bonne couche d'accès aux données accepte la Sqlconnection à utiliser en tant que paramètre afin de pouvoir la partager entre les appels, gardant ainsi la portée de transaction local sur le serveur.