Configuración de transacciones

El atributo transaction es una propiedad declarativa que administra automáticamente las transacciones para el desarrollador de componentes. Al establecer este atributo, se elimina la necesidad de usar controles de transacción explícitos en el componente.

COM+ usa el atributo de transacción del componente para determinar el tipo de protección de transacciones necesaria para cada objeto que activa. En función de su requisito, un objeto puede compartir la transacción del autor de la llamada, requerir una nueva transacción o funcionar sin protección de transacciones.

COM+ proporciona los siguientes valores de atributo de transacción:

Deshabilitado

En general, debe establecer este valor de atributo solo cuando esté seguro de que el componente nunca tiene acceso a un administrador de recursos. Al deshabilitar el atributo de transacción, COM+ omite los requisitos transaccionales del componente para determinar la ubicación del contexto del objeto. Como resultado, el objeto puede compartir el contexto del autor de la llamada (y la transacción). Al migrar un componente COM a COM+, debe deshabilitar el atributo transaction para mantener el mismo comportamiento transaccional que el componente COM no configurado.

Nota:

Un componente no configurado es un componente COM que no se ha instalado en una aplicación COM+.

No compatible

Al establecer este valor de atributo, COM+ garantiza que cualquier objeto creado a partir del componente nunca participa en una transacción, independientemente del estado transaccional de su llamador. Al declarar este valor, se asegura de que un objeto no vote en la transacción del autor de la llamada ni pueda iniciar una transacción propia. No compatible es el valor predeterminado para todos los componentes.

Apoyado

Al establecer este valor de atributo, COM+ garantiza que cualquier objeto creado a partir del componente participe en una transacción si existe. Este valor se declara cuando se desea que un objeto comparta en la transacción del autor de la llamada sin necesidad de una transacción propia.

Obligatorio

Al establecer este valor de atributo, COM+ garantiza que cualquier objeto creado a partir del componente sea transaccional. Cuando COM+ activa un objeto con la opción Requerido, examina el estado transaccional de su llamador. Si el autor de la llamada tiene una transacción, el nuevo objeto se incluye en la transacción actual. De lo contrario, COM+ inicia una transacción, haciendo que el nuevo objeto sea la raíz de la transacción. Esta es la configuración preferida para un componente que realiza actividades de recursos porque ayuda a proporcionar protección de transacciones para esas actividades.

Requiere nuevo

Al establecer este valor de atributo, COM+ garantiza que los objetos creados a partir del componente deben participar en una nueva transacción como raíz de la transacción, independientemente del estado transaccional del autor de la llamada. COM+ inicia automáticamente una nueva transacción que es distinta de la transacción del autor de la llamada.

Nota:

COM+ no admite transacciones anidadas. Cuando un objeto transaccional llama a otro componente marcado como Requiere nuevo, COM+ crea un límite transaccional independiente para el objeto recién activado. La segunda transacción no puede afectar a la primera transacción a menos que la primera transacción apunte explícitamente los resultados de la segunda transacción y modifique su voto en función de esos resultados.

Dependencias de atributos de transacción

En la tabla siguiente se muestran las características de cada valor de atributo de transacción COM+, incluido el efecto del valor en las características de transacción. COM+ aplica la activación JIT y la sincronización para todos los componentes de transacción.

Valor del atributo Nueva transacción Transacción del cliente Raíz de transacción Activación JIT Synchronization
Disabled
Nunca
Es posible
Nunca
Opcionales
Opcionales
No compatible
Nunca
Nunca
Nunca
Opcionales
Opcionales
Compatible
Nunca
Si el cliente tiene transacciones
Nunca
Obligatorio
Obligatorio
Obligatorio
Es posible
Si el cliente tiene transacciones
Si el cliente no tiene ninguna transacción
Obligatorio
Obligatorio
Se requiere nueva
Siempre
Nunca
Siempre
Obligatorio
Obligatorio

Límites de transacción

Una transacción tiene un principio, un final y se produce exactamente una vez. Durante su ejecución, una transacción puede llamar a en un recurso, como una base de datos o una cola, para realizar una o varias tareas. Cada recurso se encuentra dentro del límite de la transacción. Todos los recursos dentro de un límite de transacción, que pueden abarcar varios límites de proceso y equipo, comparten una sola transacción. La administración de la coherencia entre estos límites de proceso y equipo es importante.

COM+ garantiza la coherencia mediante la administración automática de límites de transacción, en función del valor del atributo de transacción establecido para cada componente. Una transacción COM+ fluye automáticamente a los objetos indicados para participar en una transacción y omite los objetos indicados para ejecutarse fuera de una transacción. COM+ no admite transacciones anidadas. En su lugar, las transacciones COM+ son distintas y de corta duración.

El primer objeto de un límite de transacción es especial para la transacción y se denomina objeto raíz de la transacción. Solo puede haber un objeto raíz en una transacción. Todos los demás objetos de la jerarquía transaccional bajo el objeto raíz se denominan objetos interiores.

Asignación de transacciones

Una manera de asegurarse de que un objeto se incluye en el límite de transacción correcto es asignar las transacciones antes de empezar a escribir los componentes. Mediante la asignación de transacciones, puede determinar la mejor configuración para cada componente que escriba. Cuanto más seguro sea sobre cómo se van a usar los componentes, más fácil es seleccionar el valor de atributo de transacción correcto.

En tiempo de ejecución, COM+ examina el atributo de transacción para determinar si un objeto debe ser la raíz de una nueva transacción, crearse en una transacción existente o crearse como un objeto no transaccional.

En la ilustración siguiente se muestra una posible asignación de transacciones. En la ilustración, el cliente crea el objeto 1, que requiere una transacción. Dado que no existe ninguna transacción, COM+ crea la transacción 1 y coloca el objeto 1 en él como el objeto raíz. El objeto 1 crea el objeto 2, que admite transacciones y, por tanto, se coloca en la transacción 1. El objeto 2 crea el objeto 3, que no admite transacciones y, por tanto, se coloca fuera de todas las transacciones. El objeto 2 también crea el objeto 4, que requiere una transacción y, por tanto, se coloca en la transacción 1. El objeto 3 crea el objeto 5, que admite transacciones. Sin embargo, dado que el objeto 5 se crea mediante un objeto que no existe dentro de una transacción, también se coloca fuera de todas las transacciones. El objeto 4 crea el objeto 6, que requiere una nueva transacción, por lo que COM+ crea la transacción 2 y coloca el objeto 6 en él como el objeto raíz. El objeto 6 crea el objeto 7, que admite transacciones y, por tanto, se coloca en la transacción 2.

Diagrama que muestra una interacción del cliente con la transacción 1 y la transacción 2.

En la ilustración anterior se muestran dos posibles áreas problemáticas. En primer lugar, la mayoría del trabajo se divide entre dos transacciones distintas. Si se produce un error en la transacción 1 después de que el objeto 4 cree el objeto 6, la transacción 2 no se verá afectada por el resultado de la transacción 1. Si este resultado no se intenta, es posible que prefiera plegar las operaciones de ambas transacciones en una sola transacción, lo que puede realizar cambiando el atributo transaction de Object 6 a Required.

La ilustración de asignación también muestra que el objeto 3 y el objeto 5 no son transaccionales, que se ejecutan completamente fuera del ámbito de las transacciones 1 y 2. Si el objeto 5 actualiza los datos persistentes, es posible que desee reconsiderar su estado no transaccional. El objeto 5 se puede colocar dentro de una transacción cambiando su atributo de transacción a Requerido.

Establecer el atributo transaction