Compartir a través de


Interoperabilidad con Enterprise Services y transacciones de COM+

El espacio de nombres System.Transactions admite la interoperabilidad entre los objetos de transacción creados utilizando este espacio de nombres y las transacciones creadas a través de COM+.

Puede utilizar la enumeración EnterpriseServicesInteropOption al crear una nueva TransactionScope instancia para especificar el nivel de interoperabilidad con COM+.

De forma predeterminada, cuando su código de aplicación comprueba la propiedad estática Current, System.Transactions intenta buscar una transacción que es de lo contrario actual o un objeto TransactionScope que indica que Current es null. Si no encuentra ninguno de estos, System.Transactions consulta una transacción en el contexto de COM+. Tenga en cuenta que aunque System.Transactions puede buscar una transacción del contexto de COM+, todavía favorece transacciones que son nativas a System.Transactions.

Niveles de la interoperabilidad

La enumeración EnterpriseServicesInteropOption define los niveles siguientes de interoperabilidad. None, Full y Automatic.

La clase TransactionScope proporciona constructores que aceptan EnterpriseServicesInteropOption como un parámetro.

None, como indica el nombre, implica que no hay interoperabilidad entre contextos y ámbitos de transacción de System.EnterpriseServices. Después de crear un objeto TransactionScope con None, cualquier cambio a Current no se refleja en el contexto de COM+. De igual forma, cambia a la transacción en el contexto de COM+ no se refleja en Current. Este es el modo de funcionamiento más rápido para System.Transactions porque no hay ninguna sincronización adicional necesaria. None es el valor predeterminado usado por TransactionScope con todos los constructores que no aceptan EnterpriseServicesInteropOption como parámetro.

Si hace la necesidad para combinar las transacciones System.EnterpriseServices con su transacción ambiente, necesita utilizar Full o Automatic. Ambos de estos valores confían en una característica llamada servicios sin componentes y por consiguiente debería estar ejecutándose en Windows XP Service Pack 2 o Windows Server 2003 al utilizarlos.

Full especifica que las transacciones ambientes para System.Transactions y System.EnterpriseServices siempre son los mismos. Producir crear un nuevo System.EnterpriseServices contexto transaccional y aplicar la transacción que es actual para que TransactionScope sea actual para ese contexto. Como a tal, la transacción en Current está completamente en sincronización con la transacción en Transaction. Este valor presenta una reducción del rendimiento porque quizá sea necesario crear nuevos contextos COM+ .

Automatic especifica los siguientes requisitos:

  • Cuando se comprueba Current, System.Transactions debería admitir las transacciones en el contexto de COM+ si detecta que se está ejecutando en un contexto distinto del contexto predeterminado. Observe que el contexto predeterminado no puede contener una transacción. Por consiguiente, en el contexto predeterminado, la transacción almacenada en el almacenamiento local de subprocesos utilizado por Automatic se devuelve incluso con System.Transactions, para Current.

  • Si se crea un nuevo objeto TransactionScope y la creación se produce en un contexto distinto del contexto predeterminado, la transacción que es actual para el objeto TransactionScope se debería reflejar en COM+. En este caso, Automatic se comporta como Full en eso crea un contexto de nuevo COM+.

Además cuando Current se establece en Full y Automatic, ambos de estos modos implican que no se puede establecer ese Current directamente. Cualquier intento para establecer directamente Current otro distinto de crear resultados TransactionScope en un InvalidOperationException. Nuevos ambientes de transacción han heredado el valor de enumeración EnterpriseServicesInteropOption que no especifica que valor hay que utilizar. Por ejemplo, si crea un nuevo objeto TransactionScope con Full, y, a continuación, crea un segundo objeto TransactionScope pero no especifica un valor EnterpriseServicesInteropOption, el segundo objeto TransactionScope también tiene Full.

En resumen, las reglas siguientes se aplican al crear un nuevo ámbito de la transacción:

  1. Current se comprueba para ver si hay una transacción. Comprueba los resultados en:

  2. Se comprueba el valor de la enumeración TransactionScopeOption pasada por el constructor TransactionScope. Esto determina si se debe crear una nueva transacción.

  3. Si se va a crear una nueva transacción, los valores siguientes de resultado EnterpriseServicesInteropOption en:

    • Full: se crea una transacción asociada a un contexto de COM+.

    • None: se crea una transacción System.Transactions.

    • Automatic: si hay un contexto COM+, se crea una transacción y se adjunta al contexto.

La tabla siguiente muestra el contexto del Enterprise Services (ES) y un ámbito transaccional que requiere una transacción mediante la enumeración EnterpriseServicesInteropOption.

Contexto ES None Automático Completo
Contexto predeterminado Contexto predeterminado Contexto predeterminado Crear nuevo
contexto transaccional
Contexto no predeterminado Mantener el contexto de cliente Crear el nuevo contexto transaccional Crear el nuevo contexto transaccional

La tabla siguiente muestra lo que es la transacción ambiente, dado un contexto System.EnterpriseServices determinado y un ámbito transaccional que requiere una transacción mediante la enumeración EnterpriseServicesInteropOption.

Contexto ES None Automático Completo
Contexto predeterminado ST ST ES
Contexto no predeterminado ST ES ES

En la tabla anterior: