lunes, 13 de junio de 2011

Timeout en TransactionScope

Trabajando con TransactionScope, ¿Recuerdas “ha venido para quedarse”? nos han surgido problemas relacionados con el timeout de las transacciones.

Lo cierto es que no está muy claro cuál es el timeout por defecto de una nueva transacción, cual es el máximo valor que puede alcanzar una transacción, etc.

Lo primero a tener en cuenta es que podemos incluir la siguiente sección a nuestro fichero web.config para controlar el timeout por defecto de nuevas transacciones.

<configuration>

<system.transactions>

<defaultSettings timeout="00:01:00"/>

</system.transactions>

</configuration>

 

El atributo timeout determina el valor predeterminado para el timeout de una nueva transacción.

A nivel de machine.config, podemos también especificar el máximo valor de timeout disponible, maxTimeout (esto está para que los administradores de sistemas nos hagan la vida imposible a los pobres desarrolladores… bueno, y también para controlar a desarrolladores locos…). Ninguna transacción podrá tener un timeout superior al valor establecido (o al valor por defecto). Puedes saber exactamente qué fichero machine.config te está afectando consultando System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile)

<configuration>

<system.transactions>

<machineSettings maxTimeout="00:10:00"/>

</system.transactions>

</configuration>

 

En caso de no existir ninguna de estas secciones, los valores predeterminados son de 1 minuto para la propiedad timeout y 10 minutos para la propiedad maxTimeout.

La referencia sobre estas secciones las puedes encontrar aquí.

En tiempo de ejecución, puedes ver que valores exactos tienes consultado las propiedades TransactionManager.DefaultTimeout y TransactionManager.MaximumTimeout.

Otra consideración es aclarar como la transacción toma el valor del timeout en función de las opciones y constructor que elijamos al crear nuestro nuevo objeto TransactionScope.

El siguiente código tomará el valor de timeout por defecto para una nueva conexión (el valor de TransactionManager.DefaultTimeout):

Using tran As New Transactions.TransactionScope

tran.Complete()

End Using

 

Sin embargo, este otro código tomará el valor 0, que significa infinito (aunque recuerda que nunca podrá irse más allá del valor de maxTimeout establecido en el machine.config).

' options se inicializa con Timeout igual a 00:00:00, luego infinito

Dim options As New TransactionOptions

Using tran As New TransactionScope(TransactionScopeOption.Required, options)

tran.Complete()

End Using

 

Un saludo!

No hay comentarios:

Publicar un comentario