Partilhar via


Interoperabilidade com serviços empresariais e transações COM+

O System.Transactions namespace suporta interoperabilidade entre objetos de transação criados usando esse namespace e transações criadas por meio de COM+.

Você pode usar a EnterpriseServicesInteropOption enumeração ao criar uma nova TransactionScope instância para especificar o nível de interoperabilidade com COM+.

Por padrão, quando o código do aplicativo verifica a propriedade estática Current , System.Transactions tenta procurar uma transação que seja atual ou um TransactionScope objeto que determine que Current é nulo. Se não conseguir encontrar nenhum destes, System.Transactions consulta o contexto COM+ para uma transação. Observe que, embora System.Transactions possa encontrar uma transação do contexto COM+, ela ainda favorece transações que são nativas de System.Transactions.

Níveis de interoperabilidade

A EnterpriseServicesInteropOption enumeração define os seguintes níveis de interoperabilidade — NoneFulle Automatic.

A TransactionScope classe fornece construtores que aceitam EnterpriseServicesInteropOption como um parâmetro.

None, como o nome indica, implica que não há interoperabilidade entre System.EnterpriseServices contextos e escopos de transação. Depois de criar um TransactionScope objeto com None, quaisquer alterações feitas a Current não são refletidas no contexto COM+. Do mesmo modo, as alterações à operação no contexto COM+ não são refletidas no Current. Este é o modo de operação mais rápido porque System.Transactions não há sincronização extra necessária. None é o valor padrão usado por TransactionScope com todos os construtores que não aceitam EnterpriseServicesInteropOption como parâmetro.

Se pretender combinar System.EnterpriseServices transações com a sua transação ambiente, precisa usar um ou outro: Full ou Automatic. Ambos os valores dependem de um recurso chamado serviços sem componentes e, portanto, você deve estar executando no Windows XP Service Pack 2 ou Windows Server 2003 ao usá-los.

Full especifica que as transações ambientais para System.Transactions e System.EnterpriseServices são sempre as mesmas. Isso resulta na criação de um novo System.EnterpriseServices contexto transacional e na aplicação da transação que é atual para que o TransactionScope seja atual para esse contexto. Como tal, a transação em Current está completamente sincronizada com a transação em Transaction. Esse valor introduz uma penalidade de desempenho porque novos contextos COM+ podem precisar ser criados.

Automatic especifica os seguintes requisitos:

  • Quando Current estiver marcado, System.Transactions deve suportar transações no contexto COM+ se detetar que está a ser executado num contexto diferente do contexto predefinido. Observe que o contexto padrão não pode conter uma transação. Portanto, no contexto padrão, mesmo com Automatic, a transação armazenada no armazenamento local de thread usado por System.Transactions é retornada para Current.

  • Se um novo TransactionScope objeto for criado e a criação ocorrer num contexto diferente do contexto padrão, a transação que está atual para o objeto TransactionScope deverá ser refletida em COM+. Neste caso, Automatic comporta-se como Full na medida em que cria um novo contexto COM+.

Além disso, quando Current é definido tanto em Full quanto em Automatic, ambos os modos implicam que Current não pode ser definido diretamente. Qualquer tentativa de definir Current diretamente, exceto criando um TransactionScope, resulta em um InvalidOperationException. O EnterpriseServicesInteropOption valor de enumeração é herdado por novos escopos de transação que não especificam explicitamente qual valor usar. Por exemplo, se criar um novo TransactionScope objeto com Full, e, em seguida, criar um segundo TransactionScope objeto, mas não especificar um EnterpriseServicesInteropOption valor, o segundo TransactionScope objeto também terá um Full.

Em resumo, as seguintes regras se aplicam ao criar um novo escopo de transação:

  1. Current é verificado para ver se há uma transação. Esta verificação resulta em:

  2. O valor da TransactionScopeOption enumeração passada pelo TransactionScope construtor é verificado. Isso determina se uma nova transação deve ser criada.

  3. Se uma nova transação for criada, os seguintes valores de EnterpriseServicesInteropOption resultam em:

    • Full: é criada uma transação associada a um contexto COM+.

    • None: uma System.Transactions transação é criada.

    • Automatic: se houver um contexto COM+, uma transação é criada e anexada ao contexto.

A tabela a seguir ilustra o contexto do Enterprise Services (ES) e um escopo transacional que requer uma transação usando a EnterpriseServicesInteropOption enumeração.

Contexto ES Nenhum Automático Completo
Contexto padrão Contexto padrão Contexto padrão Criar novo
contexto transacional
Contexto não padrão Manter o contexto do cliente Criar novo contexto transacional Criar novo contexto transacional

A tabela a seguir ilustra o que é a transação ambiente, dado um contexto específico System.EnterpriseServices e um escopo transacional que requer uma transação usando a EnterpriseServicesInteropOption enumeração.

Contexto ES Nenhum Automático Completo
Contexto padrão ST ST ES
Contexto não padrão ST ES ES

Na tabela anterior: