martes, 3 de julio de 2012

Buenos Días

Bueno, este es mi primer post, así que he decidido dedicarlo a un tema que me dejó pensando mucho en cuanto al uso del WCF-SQL adapter.

Imagino que muchos de ustedes han utilizado este adaptador. Bien normalmente para usarlo se piensa en dos configuraciones claves en el proceso, el PolledDataAvailableStatement y el PollingStatement.

Bien la situación que traigo a colación para este post tiene que ver con una situación que tuve esta semana en la oficina realizando una integración bastante particular.

Tengo la información que requiero de Biztalk en unas tablas de un sistema de información el cual tiene su base de datos en un servidor SQL Server 2008 R2. Esta Información llega a un servidor de Base de Datos de las mismas características donde por cada registro que proceso, realizo un par de comprobaciones y por reglas de negocio debo dejar un campo estado en 1 que significa que este registro se procesó.

Hasta ahí todo es normal. Sin embargo surgió un problema con este campito, en algunos casos el registro no necesariamente debe ser devuelto en la consulta, pero debe registrarse como procesado (El campo de todas formas debe ser actualizado en 1).

Actualmente para el manejo de estos campos utilizo una sentencia Update dentro del script que tengo en el PollingStatement. una vez realizo la actualización ejecuto el select para poder obtener los datos para Biztalk.

Bien, como les mencioné anteriormente, si mi consulta no trae datos, igual debería poner en procesado este campo de estado. Oh sorpresa, el update nunca se realizó.

Después de revisar que todo el proceso funcionara correctamente y dada la premura de la entrega, decidí poner una traza en la base de datos. Más sorprendente aún, el update en la traza aparece actualizado, entonces por qué no funciona????

Bueno, el buen Biztalk por defecto activa una transacción propia que inicia en cuanto el PollingStatement arranca, pero en caso de no retornar datos hace rollback de la misma.... que proactivo es Biztalk no?

Bueno pues les comento, que existe una forma sencillísima de solucionar este impase, pero hay que tener en cuenta muchas consideraciones para hacerlo.

En la configuración del Adaptador, contamos con la posibilidad de impedir que Biztalk cree la transacción en la propiedad UserAmbientTransaction. Esta decisión debe ser tomada con mucha cautela, por que podemos llegar a tener errores en los datos que llegan a biztalk o en el peor de los casos, un error en manipulación de datos que pueden dejar nuestra información corrupta, en fin hay miles de cosas que pueden suceder. Afortunadamente este no era mi caso, así que decidí poner la propiedad en false, y problema resuelto.

Esta es la configuración que se debe colocar:


Cualquier duda, inquietud, queja, quedo pendiente a sus comentarios.

Un saludo para todos