c# - new - using transaction
¿Timeout de TransactionScope ocurre prematuramente? (2)
Estoy usando TransactionScope
para hacer algunas inserciones y actualizaciones por lotes. El problema es que obtengo excepciones de tiempo de espera en una operación de 30 minutos de duración incluso cuando configuro el tiempo de espera de TransactionScope
en una hora.
Además, después de la excepción, inserta una cantidad aparentemente aleatoria de los registros del lote. Por ejemplo, la última operación tenía 12440 insertos y después del tiempo de espera, se insertaron 7673 registros en la tabla.
El tiempo de espera de SqlConnection
y SqlCommand
se establece en int.MaxValue
.
¿Qué estoy haciendo mal?
Aquí está mi código:
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1)))
{
try
{
using (db = new DB())
{
//operations here
}
}
catch (Exception ex)
{
throw new Exception("DB Error:/r/n/r/n" + ex.Message);
}
transaction.Complete();
} // <--- Exception here: Transaction aborted (Inner exception: Timeout)
Vería si puede utilizar la clase SqlBulkCopy . Debería ser mucho más rápido y podría eliminar la necesidad de un largo tiempo de espera.
¿Su transacción falla luego de 10 minutos? Si es así, probablemente esté presionando el tiempo máximo de espera del administrador de transacciones establecido en machine.config. Si recuerdo correctamente, si intenta establecer un tiempo de espera mayor que el valor máximo, su configuración será ignorada. Intente subir el valor en machine.config y vea si eso ayuda con su problema.
En términos de confirmaciones aleatorias, ¿configura la Transaction Binding=Explicit Unbind
en su cadena de conexión? El valor predeterminado es Transaction Binding=Implicit Unbind
. Desde MSDN :
La Desvinculación implícita hace que la conexión se separe de la transacción cuando termina. Después de desconectar, las solicitudes adicionales en la conexión se realizan en el modo de confirmación automática. La propiedad System.Transactions.Transaction.Current no se comprueba al ejecutar solicitudes mientras la transacción está activa. Una vez que la transacción ha finalizado, se realizan solicitudes adicionales en el modo de confirmación automática.
Básicamente, cuando se agote el tiempo de espera de la transacción, todas las inserciones hasta ese momento se revertirán, pero las inserciones adicionales que se realicen con la misma conexión se realizarán en el modo de confirmación automática, en el que cada declaración de inserción se confirmará de inmediato. Eso suena similar al escenario que está viendo (pero es difícil saberlo sin ver el código completo / repro).