Vamos a comenzar hoy a comentar aspectos relacionados con el Trabajo con Transacciones desde SQL Server Integration Services.
Cuando hablamos de transacciones en SSIS pensamos de la misma forma que cuando hablamos de Transacciones en el motor relacional, hablamos de enlazar las acciones de base de datos que las tareas realizan en unidades atómicas y mantener de esta forma la integridad de los datos. No estamos hablando de programar explícitamente las transacciones con sus sentencias de tipo BEGIN TRAN, COMMIT TRAN, y/o ROLLBACK TRAN, aquí vamos a proceder de forma diferente, aunque como he dicho otras veces, todo lo que llevamos del mundo relacional es válido en cuanto a enfoques y criterios para que sea aplicado en SSIS.
Para trabajar desde SSIS vamos a detenernos en algunas propiedades, las explicamos hoy y en la próxima entrada “jugamos” con ellas.
La propiedad TransactionOpcion funciona y se configura de la misma forma para todos los objetos del Flujo de control: tareas, contenedores y paquete. Sus tres posibles valores son: Non Supported, Supported y Required y su funcionamiento es el siguiente:
Non Supported – El objeto no es transaccional, aunque esté ejecutándose en el contexto de una transacción, es decir no participa en transacción alguna. Esta es una configuración muy interesante, como veremos más adelante, ya que nos permitirá conservar algunas acciones aunque falle una transacción.
Supported – Este es el valor predeterminado y significa que el objeto se ejecuta en el contexto de la transacción que ya estuviese abierta (por alguno de sus «padres»). En caso de que no se hubiese iniciado ninguna transacción, el objeto no es transaccional, es decir, participa o no en dependencia de otro objeto, heredando el comportamiento que le sea impuesto.
Required – indica que este objeto se ejecuta en el contexto de una nueva transacción si el contenedor primario aún no ha iniciado una transacción, en cuyo caso pasa a formar parte de la misma transacción.
¿Cómo combinar estos valores? Veamos un par de casos:
Si se configura Required a nivel de paquete y el resto de elementos como Supported, todos los elementos del Flujo de Control se ejecutarán por defecto en el contexto de una transacción. Si uno de estos elementos falla, se desharán los cambios realizados por el resto de elementos que se hubiesen ejecutado dentro de la misma transacción, es decir, todo lo que se ejecuta en el paquete, a menos… que algún elemento haya sido configurado como Non Supported.
Si se configura Supported a nivel de paquete y el resto de elementos como Required, todos los elementos del Flujo de Control (hijos del paquete) iniciarán nueva transacción. Si uno de estos elementos falla, se desharán los cambios realizados por ese elemento en concreto, mientras que el resto de elementos como no se han ejecutado dentro de la misma transacción siguen su camino, a menos… que algún elemento haya sido configurado como Non Supported.
La propiedad IsolationLevel especifica cómo gestionará SSIS la transacción. Si el valor de la propiedad TransactionOpcion es «Required«, entonces IsolationLevel, define qué nivel de aislamiento se va a producir durante una transacción. Los valores son Unspecified, Chaos, ReadUncommitted, ReadCommitted, RepeatableRead, Serializable y Snapshot.
El valor predeterminado de esta propiedad es Serializable, que es el más restrictivo, pero a la vez más seguro evita que se modifiquen los datos anteriores al inicio de la transacción. Cuando pensamos en los efectos secundarios de la simultaneidad habilitados por los distintos niveles de aislamiento tenemos que para Serializable, No ocurre ni lectura desfasada, ni lectura no repetible ni ficticia., esto se debe a que es el nivel más alto, en el que se aíslan completamente las transacciones entre sí. El valor de la propiedad IsolationLevel solicitado por el contenedor se respeta solamente cuando el contenedor inicia una nueva transacción. Por otra parte, este valor para un contenedor secundario se omite cuando TransactionOption para el contenedor secundario es Supported y el contenedor secundario combina la transacción de un contenedor primario, por lo que hereda del padre. Para ver más sobre Niveles de Aislamiento, BOL. Para ver el resto de valores, BOL.
Un aspecto importante es que para el trabajo con transacciones, SSIS utiliza el servicio MSDTC (Microsoft Distributed Transaction Coordinator), por lo cual, el servicio MSDTC debe estar disponible en caso contrario, se producirá el siguiente error: Error: 0xC001401A at Data Flow Task: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B «The Transaction Manager is not available.» The DTC transaction failed to start. This could occur because the MSDTC Service is not running.
Hemos hablado antes de que una Tarea de Flujo de Control es Ejecutar Paquete, todo lo que hemos visto hoy se adapta plenamente a este tipo de tareas, por tanto estamos viendo que podemos incluir dentro de una misma transacción, distintos paquetes, distintos orígenes de datos, en fin, está en nuestras manos. No todos los proveedores de datos soportan Transacciones DTC; pero una vez capturados los datos, podemos realizar todo el procesamiento desde un destino SQL Server y controlar las transacciones desde el flujo de control.
Hasta aquí esta introducción de los aspectos relacionados con Trabajo con transacciones dentro de SQL Server Integration Services. En la próxima entrega, toca empezar a «jugar» para ver los distintos efectos que se producen.