2010-08-27 22 views
5

Tengo una aplicación multiproceso C# donde cada subproceso tiene su propio conjunto de conexiones db. Cada subproceso usa TransactionScope/DTC. A veces, aparece la excepción "La transacción ha abortado". No es de un tiempo de espera ya que ocurre en menos de 2 segundos desde el inicio de la transacción.La transacción ha abortado

Aquí está la StackTrace:

en System.Transactions.TransactionStateAborted.BeginCommit (InternalTransaction TX, Boolean asyncCommit, AsyncCallback AsyncCallback, objeto asyncState) en System.Transactions.CommittableTransaction.Commit() en System.Transactions.TransactionScope.InternalDispose() en System.Transactions.TransactionScope.Dispose() en MyNamespace.CallingMethod()

Sucede muy poco, digamos una vez cada 100.000 transacciones.

Medio Ambiente: Windows Server 2003 .Net 2.0 conecta a SqlServer 2005

¿Alguna idea sobre por qué esto está ocurriendo? Gracias!

+0

hace el SQL, DTC, o el sistema operativo registros de errores tienen cualquier detalle adicional? – StingyJack

+0

cualquier entrada en los registros de eventos con esa marca de tiempo? –

+0

Caja de producción, por lo que es difícil obtener información allí sin burocracia. Veré si puedo sacar algo del Registro de eventos, eso es más fácil. ¡Gracias! – Dan

Respuesta

0

Creo que esto se atribuye a la inestabilidad de la red. Es muy poco frecuente, y no ha criado su fea cabeza en algunos meses.

1

¿Es esta pila de llamadas de su InnerException más interna? Obtengo estas excepciones, por lo general (aunque no siempre) una InnerException con más información.

Mi apuesta estaría en un punto muerto de la base de datos.

+0

Sí, esta fue la excepción más interna. Tengo acceso a las huellas de interbloqueo, y no se encontraron ninguno durante este tiempo. – Dan

1

Se puede crear un volcado de memoria, la instrucción se puede encontrar aquí http://blogs.msdn.com/b/joncole/archive/2007/03/29/creating-a-process-memory-dump.aspx

A continuación, se puede comprobar con windbg para revelar lo que es una excepción de la raíz causada este problema. Hay mucha información útil acerca de cómo usar windbg verifique la excepción administrada.

Mientras tanto, puede usar el generador de perfiles sql para controlar si ocurrió algún error sql en el momento en que se produjo la excepción.

+0

Me gusta esta idea. Voy a volver a intentar y recrear esto en dev y obtener una respuesta a este problema. – Dan

+0

Si tiene un volcado de memoria, puedo verificarlo por usted. puedes ponerlo en la carpeta pública skydrive. –

0

Como dijo Andreas, mire las InnerExceptions. También conecte el Analizador de SQL y busque cualquier bloqueo/finalización.

1

Si alguno de ustedes enfrenta este problema, tenga en cuenta que pude encontrar la solución y el problema .. En el archivo de configuración de la aplicación, faltaban las propiedades de la cadena de conexión que era la "Enlistada".

A principios de la cadena de conexión era = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;" providerName="System.Data.SqlClient" />

Ahora la cadena de conexión es actualizado = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;Enlist=False;" providerName="System.Data.SqlClient" />

Cuestiones relacionadas