Matices de TransactionScope
Comienzo a entender realmente cómo funciona TransactionScope. Ya comenté hace tiempo que tuve que desarrollar una clase AmbitoTransa para ofrecer una funcionalidad común a SQL Server y a Access, y que en Access trabajo con transacciones nativas de ADO directamente, mientras que en SQL Server delego directamente en TransactionScope. Para usar esta clase hasta ahora hemos tenido que activar MSDTC, tanto en los clientes como en el servidor, el cual es necesario para trabajar con transas distribuidas. ¿Y cuándo necesitamos nosotros transas distribuidas? Normalmente nunca, es decir, al guardar datos en varias entidades atómicamente, sólo necesitamos una transacción local (con una única base de datos). ¿Entonces cuándo se necesita MSDTC? Cuando dentro de una transacción que parece trabajar con una única conexión, abrimos y cerramos dicha conexión más de una vez (una vez por cada entidad que guardemos). En ese caso, al abrir por segunda vez la misma conexión, la transa promociona a distribuida (ver en esta respuesta). Esto además ralentiza mucho la primera vez que se produce (varios segundos), y algo cada vez que es necesario, así que tenemos que intentar evitarlo. En Nibi.Negocio es difícil, porque la conexión se abre y cierra en la capa de acceso a datos, cuando es la capa de negocio la que abre la transa y llama a los Guardar que considera necesarios. Una solución si no tuviéramos esta restricción de diseño es la utilización de un DbConnectionScope, que facilita la reutilización de la misma conexión. En nuestro caso, vamos a intentar simplificar, aprovechando que contamos con un AmbitoTransa que oculta la transacción, para que sea este propio ámbito quien almacene la conexión actual. Cada vez que necesitemos abrir una conexión, comprobamos si es la misma que está ya abierta (comparando su cadena de conexión literalmente, no es exacto pero no tenemos otra y normalmente va a funcionar y si no funciona sólo vamos a sufrir una promoción a distribuida) y si está ya abierta la utilizamos en lugar de abrir una nueva. Voy a implementarlo y si veo pegas las comento aquí. Chao.
