Usar componentes no transaccionales en una transacción
A menudo resulta útil colocar componentes no transaccionales en una transacción para aprovechar las propiedades ACID de las transacciones. Por ejemplo, si tiene componentes heredados no transaccionales que usa para actualizar contraseñas en una red, puede colocar esos componentes en una transacción para asegurarse de que las actualizaciones de contraseñas sean coherentes en toda la red.
El objeto de contexto de transacción es un objeto genérico que permite a los clientes no transaccionales combinar el trabajo de varios objetos COM en una sola transacción, sin necesidad de desarrollar un nuevo componente específicamente para ese propósito. A diferencia de una transacción automática, el objeto de contexto de transacción requiere que su cliente confirme o anule explícitamente la transacción.
De forma predeterminada, el valor del atributo de transacción del objeto de contexto de transacción se establece en Requerido. COM+ anula la transacción si el cliente libera el objeto de contexto de transacción sin emitir explícitamente una llamada de confirmación o anulación.
En el siguiente ejemplo de Visual Basic se muestra cómo un cliente no transaccional puede componer el trabajo realizado por más de un objeto en una sola transacción:
Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog ' Cdog is a user-defined component.
' Get TransactionContext object.
Set objTxCtx = _
CreateObject ("TxCtx.TransactionContext")
' Create instances of Cat and Dog.
Set objCat = _
objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _
objTxCtx.CreateInstance ("MyDLL.Cdog")
' Both objects do work.
objDog.Bark
objCat.Hiss
' Commit the transaction.
objTxCtx.Commit
Limitaciones del objeto de contexto de transacción
A continuación se muestran algunas limitaciones importantes del objeto de contexto de transacción:
Cuando se usa un objeto de contexto de transacción, la lógica de la aplicación que combina el trabajo de varios objetos en una sola transacción está vinculada a una implementación de cliente no transaccional específica y se pierden algunas ventajas de usar componentes COM. Estas ventajas perdidas incluyen las siguientes:
- Capacidad de reutilizar la lógica de la aplicación como parte de una transacción aún mayor
- Imposición de seguridad declarativa
- Flexibilidad para ejecutar la lógica de forma remota desde el cliente
El objeto de contexto de transacción se ejecuta en proceso con el cliente no transaccional, lo que significa que COM+ debe estar disponible en el equipo cliente no transaccional. Esto podría no ser un problema, por ejemplo, cuando el objeto de contexto de transacción se usa desde una página de Páginas de Active Server (ASP) que se ejecuta en el mismo servidor que COM+.
No se obtiene un contexto para el cliente no transaccional al crear un objeto de contexto de transacción. El trabajo transaccional solo se puede realizar indirectamente a través de objetos COM creados mediante el objeto de contexto de transacción. En concreto, el cliente no transaccional no puede usar dispensadores de recursos COM+ (como ODBC) y tener el trabajo incluido en la transacción. Por ejemplo, los desarrolladores pueden estar familiarizados con la sintaxis siguiente para realizar trabajos transaccionales en sistemas de bases de datos relacionales:
BEGIN TRANSACTION DoWork COMMIT TRANSACTION
El uso del objeto de contexto de transacción de forma similar no produce el resultado deseado:
Set objTxCtx = CreateObject ("TxCtx.TransactionContext") DoWork objTxCtx.Commit Set objTxCtx = Nothing
La llamada a DoWork en este ejemplo no está incluida en una transacción. En su lugar, debe crear un componente COM que llame a DoWork, crear una instancia de objeto de ese componente mediante el objeto de contexto de transacción y, a continuación, llamar a ese objeto desde el cliente no transaccional para que el trabajo forme parte de la transacción controlada por el cliente.