2009-12-29 7 views
7

Ho creato una connessione sql, CN1. Quindi questo CN1 viene aperto. Più avanti nel codice c'è un transactioncope. Se eseguo un comando sql su questa connessione CN1, è presente nella transazione?È importante aprire una connessione sql nel transactioncope

Codice simile a questo;

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? 
    ... 
} 

risposta

9

è un must per aprire la connessione all'interno il TransactionScope per assicurarsi che la connessione è iscritto nella transazione.

Questo è trovato nel commento appena sopra il connection.Open in esempio MSDN this.

+2

Esiste una soluzione per risolvere questo problema all'interno di transactioncope diverso dalla connessione sql aperta nell'opzione transaction? I metodi di Enlist possono essere utili a riguardo? – mkus

+3

mkus, sì è possibile utilizzare il metodo di istanza 'SqlConnection'' EnlistTransaction (Transaction.Current); 'per inserire una connessione già aperta in un ambito di transazione. Quindi dire che * DEVE * essere aperto all'interno di TransactionScope non è vero, anche se è così che si suppone che il meccanismo automatizzato venga usato. Inoltre, l'apertura della connessione all'interno dell'ambito non garantisce nemmeno che la connessione venga inserita, poiché la stringa di connessione potrebbe specificare "Enlist = false". In genere, questa opzione non è specificata, ma è qualcosa di cui essere a conoscenza e da verificare. Vedi http://stackoverflow.com/a/2886326/88409 – Triynko

5
  1. No, comando non viene eseguito in un'operazione
  2. Aprire il collegamento all'interno del campo di applicazione o utilizzare il metodo EnlistTransaction di istanza SQLConnection. Vedi my answer in different thread.
Problemi correlati