2009-12-29 11 views
7

J'ai créé une connexion sql, CN1. Alors ce CN1 est ouvert. Plus tard dans le code, il y a un transactioncope. Si j'exécute une commande sql sur cette connexion CN1, est-ce dans la transaction?Est-il important d'ouvrir une connexion sql dans l'interface de transaction

Le code ressemble à ceci;

SqlConnection cn1 = new SqlConnection(); 
cn1.Open(); //connection opened when there is no ambient transaction. 
... 

using(TransactionScope scope = new TransactionScope()) 
{ 
    SqlCommand cmd; //a typical sql command. 

    ... 

    cmd.ExecuteNonQuery(); //Is this command within transaction? 
    ... 
} 

Répondre

9

Il est indispensable d'ouvrir la connexion au sein TransactionScope pour assurer que la connexion est inscrit dans la transaction.

Cela se trouve dans le commentaire juste au-dessus de l'exemple MSDN connection.Open dans this.

+2

Y at-il une solution pour résoudre ce problème dans le cadre d'une transaction autre que la connexion sql ouverte dans l'option de transaction? Les méthodes de Enlist peuvent-elles être utiles à ce sujet? – mkus

+3

mkus, oui vous pouvez utiliser la méthode d'instance 'SqlConnection'' EnlistTransaction (Transaction.Current); 'pour inscrire une connexion déjà ouverte dans une portée de transaction. Donc dire que * DOIT * être ouvert dans TransactionScope n'est pas vrai, bien que c'est ainsi que le mécanisme automatisé est censé être utilisé. En outre, l'ouverture de la connexion à l'intérieur de la portée ne garantit même pas que la connexion sera enrôlée, car la chaîne de connexion pourrait spécifier "Enlist = false". Généralement, cette option n'est pas spécifiée, mais c'est quelque chose à connaître et à vérifier. Voir http://stackoverflow.com/a/2886326/88409 – Triynko

5
  1. Non, la commande n'est pas exécutée dans la transaction
  2. connexion ouverte à l'intérieur du champ d'application ou d'utiliser la méthode de l'instance EnlistTransaction SqlConnection. Voir my answer in different thread.