La pregunta subyacente a esta publicación es "¿Por qué una transacción LTM no promocionada alguna vez estará en duda?"TransactionInDoubtException usando System.Transactions en SQL Server 2005
Obtengo System.Transactions.TransactionInDoubtException y no puedo explicar por qué. Desafortunadamente no puedo reproducir este problema, pero de acuerdo con los archivos de rastreo ocurre. Estoy usando SQL 2005, conectándome a una base de datos y usando una SQLConnection, así que no espero que la promoción tenga lugar. El mensaje de error indica un tiempo de espera. Sin embargo, a veces recibo un mensaje de tiempo de espera, pero la excepción es que la transacción se ha cancelado en lugar de tener dudas, lo cual es mucho más fácil de manejar.
Aquí está la traza completa:
System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByte() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment enlistment) --- End of inner exception stack trace --- at System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) at System.Transactions.CommittableTransaction.Commit() at System.Transactions.TransactionScope.InternalDispose() at System.Transactions.TransactionScope.Dispose()
¿Alguna idea? ¿Por qué estoy teniendo dudas y qué debo hacer cuando lo reciba?
EDITAR para más información
que en realidad todavía no tienen la respuesta para esto. Lo que sí me di cuenta es que la transacción en realidad se compromete parcialmente. Una tabla recibe la inserción pero la otra no recibe la actualización. El código está trazado de manera PESADA y no hay mucho espacio para que me esté perdiendo algo.
Hay una forma en que puedo averiguar fácilmente si la transacción se ha promocionado. ¿Podemos decir desde el seguimiento de la pila si es así? El compromiso de fase simple (que está en el seguimiento de la línea) parece indicar que no hay promoción para mí, pero tal vez me falta algo. Si no se promociona, ¿cómo puede estar en duda?
Otra pieza interesante del rompecabezas es que creo un clon de la transacción actual. Lo hago como un workarround a este problema. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=914869&SiteID=1
Desafortunadamente, no sé si este problema se ha resuelto. Quizás crear el clon está causando un problema. Aquí está el código correspondiente
using (TransactionScope ts = new TransactionScope())
{
transactionCreated = true;
//part of the workarround for microsoft defect mentioned in the beginning of this class
Transaction txClone = Transaction.Current.Clone();
transactions[txClone] = txClone;
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(TransactionCompleted);
MyTrace.WriteLine("Transaction clone stored and attached to event");
m_dataProvider.PersistPackage(ControllerID, package);
MyTrace.WriteLine("Package persisted");
m_dataProvider.PersistTransmissionControllerStatus(this);
MyTrace.WriteLine("Transmission controlled updated");
ts.Complete();
}
Gracias
se refleja la base de datos? –
No la base de datos no está reflejada. Tampoco esto ocurre solo en uno o dos entornos, sino en docenas de ellos – Mark
¿Ha intentado preguntar en [serverfault] (http://serverfault.com/)? O incluso presentar una solicitud de comunicación con Microsoft. Por favor, publique la respuesta cuando la encuentre ... –