2009-06-30 13 views
20

Solo curioso se qualcun altro ha questo particolare errore e sa come risolverlo?Transazione distribuita completata. O iscriviti questa sessione in una nuova transazione o nella transazione NULL

Lo scenario è il seguente ...

Abbiamo un'applicazione Web ASP.NET utilizzando Enterprise Library in esecuzione su Windows Server 2008 IIS farm connessione a un cluster di SQL Server 2008 back-end. MSDTC è attivato. Le connessioni DB sono raggruppate.

Il mio sospetto è che da qualche parte lungo la linea c'è una transazione MSDTC fallita, la connessione è stata restituita al pool e la successiva query su una pagina diversa sta rilevando la connessione anomala e ha ottenuto questo particolare errore. La cosa divertente è che abbiamo ricevuto questo errore su una query che non ha alcun bisogno di transazioni distribuite (che si impegnano in due database, ecc.). Stavamo solo facendo una query di selezione (nessuna transazione) quando abbiamo ricevuto l'errore.

Abbiamo eseguito SQL Profiling e la query è stata eseguita su SQL Server, ma non è mai tornata (poiché la transazione MSDTC era già stata interrotta nella connessione).

Alcuni altri errori correlati per accompagnare questo sono:

  • Nuova richiesta non è consentito avviare perché dovrebbe venire con valida descrittore transazione.
  • errore Provider
  • .Net Framework interno dati 60.
+0

Hai trovato qualcosa a riguardo? L'ho capito quando inserisco set di dati più grandi (> 10K righe). – StingyJack

risposta

3

Una taglia può aiutare a ottenere la risposta che cercate, ma probabilmente stai andando per ottenere risposte migliori se si dà alcuni esempi di codice e dare una migliore descrizione del quando si verifica l'errore.

L'errore si verifica solo in modo intermittente? Sembra come dalla tua descrizione.

Si sta chiudendo la chiusura che si desidera eseguire come una transazione in un blocco using TransactionScope come consigliato da Microsoft? Questo dovrebbe aiutare a evitare un comportamento strano delle transazioni. Ricordiamo che un blocco using si assicura che l'oggetto sia sempre disposto indipendentemente dalle eccezioni generate. Vedi qui: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Se stai usando TransactionScope v'è un argomento System.TransactionScopeOption.RequiresNew che dice al quadro di creare sempre una nuova transazione per questo blocco di codice:

Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew) 
     ' Do Stuff 
    End Using 

Inoltre, se si Siamo sospettosi che una connessione venga criticata e quindi rimessa nel pool di connessioni, la soluzione probabile è quella di includere il codice che potrebbe causare un errore nella connessione in un blocco Try-Catch e Dispose la connessione nel blocco catch.

+0

Giusto per chiarire, mi è stato detto che vuoi disporre della tua connessione SQL solo nel caso in cui la connessione vada in stato di errore; altrimenti non sarai in grado di raggruppare le connessioni. –

0

L'ho visto prima e la causa era esattamente quello che pensavi. Come suggerito da Rice, assicurati di smaltire correttamente gli oggetti relativi a db per evitare questo problema.

3

MSDTC ha un timeout di 90 secondi predefinito, se una query eseguita supera questo limite di tempo, si verificherà questo errore quando la transazione sta tentando di eseguire il commit.

+0

Questo era per me! (Non sono sicuro del motivo per cui questo ha avuto un downvote.) – Vaccano

1

Vecchia domanda ... ma si è imbattuto in questo problema negli ultimi giorni.

Impossibile trovare una buona risposta fino ad ora. Volevo solo condividere ciò che ho scoperto.

Il mio scenario contiene più sessioni aperte da più factory di sessione. Ho dovuto eseguire correttamente il rollback e attendere e assicurarsi che le altre transazioni non fossero più attive. Sembra che solo il rollback di uno di essi farà rollback di tutto.

Ma dopo aver aggiunto Thread.Sleep() tra i rollback, non fa l'altro e continua con il rollback. Gli hit successivi che attivano il metodo non comportano il fatto che "la nuova richiesta non sia consentita perché dovrebbe venire con un descrittore di transazione valido". errore.

https://gist.github.com/josephvano/5766488