2009-06-30 15 views
20

. ¿Es curioso si alguien más tiene este error en particular y sabe cómo resolverlo?Transacción distribuida completada. O bien aliste esta sesión en una nueva transacción o la transacción NULA

El escenario es el siguiente ...

tenemos una aplicación Web ASP.NET utilizando Enterprise Library se ejecuta en Windows Server 2008 granja de IIS se conecta a un servidor 2008 de clúster de SQL back-end. MSDTC está activado. Las conexiones DB se agrupan.

Mi sospecha es que en algún punto de la línea hay una transacción MSDTC fallida, la conexión se devolvió al grupo y la siguiente consulta en una página diferente está detectando la conexión defectuosa y obtuvo este error en particular. Lo curioso es que tenemos este error en una consulta que no tiene ninguna necesidad con la transacción distribuida (se compromete con dos bases de datos, etc.). Solo hicimos una consulta selectiva (sin transacción) cuando obtuvimos el error.

Hicimos el Perfilado SQL y la consulta se ejecutó en el Servidor SQL, pero nunca volvió (ya que la transacción MSDTC ya había sido cancelada en la conexión).

Algunos otros errores relacionados para acompañar esto son:

  • nueva solicitud no se les permite empezar a porque debe proceder con el descriptor válido transacción.
  • error del proveedor de datos interna
  • .Net Marco 60.
+0

¿Has encontrado algo al respecto? Lo consigo cuando inserto conjuntos de datos más grandes (> 10K filas). – StingyJack

Respuesta

3

Una recompensa puede ayudar a conseguir la respuesta que buscas, pero usted está probablemente va a obtener mejores respuestas si se le da algunos ejemplos de código y dar una mejor descripción de cuando ocurre el error

¿El error solo se produce de forma intermitente? Parece de su descripción.

¿Está encerrando el cierre que desea que se realice como una transacción en un bloque using TransactionScope como recomienda Microsoft? Esto debería ayudar a evitar comportamientos de transacción extraños. Recuerde que un bloque using se asegura de que el objeto siempre se elimine independientemente de las excepciones lanzadas. Ver aquí: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Si está utilizando TransactionScope hay un argumento System.TransactionScopeOption.RequiresNew que le dice al marco para crear siempre una nueva transacción para este bloque de código:

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

Además, si Sospecho que una conexión tiene una falla y luego se vuelve a colocar en el grupo de conexiones, la solución probable es encerrar el código que puede generar un error en la conexión en un bloque Try-Catch y Dispose la conexión en el bloque catch.

+0

Solo para aclarar, me han dicho que desea deshacerse de su conexión SQL solo en el caso de que la conexión entre en estado de error; de lo contrario, no podrás agrupar las conexiones. –

0

He visto esto antes y la causa fue exactamente lo que pensaba. Como sugirió Rice, asegúrese de deshacerse correctamente de los objetos relacionados con la base de datos para evitar este problema.

3

MSDTC tiene un tiempo de espera predeterminado de 90 segundos, si una consulta se ejecuta excede este límite de tiempo, se encontrará con este error cuando la transacción intenta comprometerse.

+0

¡Esto fue todo para mí! (No estoy seguro de por qué esto tenía un voto negativo). – Vaccano

1

Pregunta anterior ... pero me encontré con este problema en los últimos días.

No se pudo encontrar una buena respuesta hasta ahora. Solo quería compartir lo que descubrí.

Mi escenario contiene múltiples sesiones abiertas por varias fábricas de sesión. Tuve que retroceder correctamente y esperar y asegurarme de que las otras transacciones ya no estaban activas. Parece que solo retroceder uno de ellos revertirá todo.

Pero después de agregar el Thread.Sleep() entre retrocesos, no hace el otro y continúa bien con la reversión. Los hits posteriores que desencadenan el método no dan como resultado "No se permite que la nueva solicitud se inicie porque debe venir con un descriptor de transacción válido". error.

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

Cuestiones relacionadas