c# - transaction - Tiempo de espera del alcance de la transacción en 10 minutos
transaction rollback entity framework (7)
Hola, puedes verificar maxTimeout en tu archivo de configuración, si no tienes esta sección en tu web.config o app.config
Verifique su machine.config
<configuration>
<system.transactions>
<machineSettings maxTimeout=""/>
</system.transactions>
</configuration>
Ajusta el valor
Tengo un TransactionScope
larga ejecución en C #. Le dije al alcance que debería tener un intervalo de tiempo largo, pero aun así obtengo un tiempo de espera. Que podria causar esto?
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
DoLongCode();
}
Teniendo en cuenta un entorno de confianza total, puede anular el tiempo máximo de espera utilizando la reflexión:
//Get machineSettings session
var machineSettings = (System.Transactions.Configuration.MachineSettingsSection)ConfigurationManager.GetSection("system.transactions/machineSettings");
//Allow modifications
var bReadOnly = (typeof(ConfigurationElement)).GetField("_bReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
bReadOnly.SetValue(machineSettings, false);
//Change max allowed timeout
machineSettings.MaxTimeout = TimeSpan.MaxValue;
using (var t = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1,0,0))) { //1 hour transaction
//...
}
Para aclarar más:
El alcance de la transacción usa la configuración de configuración de la máquina como tiempo máximo de espera. El tiempo de espera predeterminado de la máquina es de 10 minutos.
Configurando la configuración de la máquina a 2 horas:
<system.transactions>
<machineSettings maxTimeout="02:00:00"/>
</system.transactions>
App.config o web.config se pueden utilizar reducidos al tiempo de espera, pero no se pueden usar para superar el tiempo de espera de configuración de la máquina.
Configurando la configuración de la aplicación a 1 hora:
<system.transactions>
<defaultSettings timeout="01:00:00" />
</system.transactions>
Además, NO recibimos ninguna excepción cuando se alcanzó el límite, tampoco registros de registro de seguimiento o evento.
Además, el objeto TransactionScope tiene sobrecargas de constructor que le permiten especificar un tiempo de espera, pero no estoy seguro de cómo se maneja.
No funcionan porque es el contexto incorrecto en el que intentas cambiar el tiempo de espera.
intenta cambiarlo más cerca de la consulta efectiva.
Deberías tener estos contextos:
using (var txn = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted, Timeout = new TimeSpan(1,0,0) })) // 1 hour or wathever, will not affect anything
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
int ct = connection.ConnectionTimeout // (read Only, this is the effective default timeout is 15 seconds)
connection.Open();
SqlCommand select = new SqlCommand(sql.query, connection); // bind to server
select.CommandTimeout = 0; // <-- here does apply infinite timeout
SqlDataReader reader = select.ExecuteReader(); // never stop
Resuelvo este problema modificando el " archivo físico " machine.config .
1. Tienes que localizar el archivo:
- 32 bits: C: / Windows / Microsoft.NET / Framework / v4.0.30319 / Config / machie.config
- 64 Bits: C: / Windows / Microsoft.NET / Framework64 / v4.0.30319 / Config / machine.config
2. Tienes que agregar el siguiente código:
<system.transactions>
<defaultSettings timeout="00:59:00" />
</system.transactions>
Al usar transacciones con la operación WCF en la cadena de llamadas, usted tiene una respuesta de solicitud y msmq llama a los correos electrónicos de ese envío, obtengo tiempo de espera en la última llamada en cola que envía el correo electrónico No tengo transacciones activadas en la llamada en cola.
Para permitir que la transacción demore más de 10 minutos, sin necesidad de cambiar machine.config, use este código
private void SetTransactionManagerField(string fieldName, object value)
{
typeof(TransactionManager).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, value);
}
public TransactionScope CreateTransactionScope(TimeSpan timeout)
{
SetTransactionManagerField("_cachedMaxTimeout", true);
SetTransactionManagerField("_maximumTimeout", timeout);
return new TransactionScope(TransactionScopeOption.RequiresNew, timeout);
}
Uso:
using (var ts = CreateTransactionScope(TimeSpan.FromMinutes(20)))
{
DoLongCode();
ts.Complete();
}
Basado en este artículo El código del artículo fue originalmente pegado aquí. El código en la respuesta ahora se refactoriza y simplifica.