Interoperabilidade com serviços corporativos e transações COM+
O System.Transactions namespace oferece suporte a interoperabilidade entre objetos de transação criados usando este namespace e transações criadas por meio do COM+.
Você pode usar o EnterpriseServicesInteropOption enumeração quando você cria um novo 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 objeto TransactionScope que determina que Current é null. Se não for possível encontrar qualquer um deles, System.Transactions consulta o contexto de COM+ para uma transação. Observe que, embora System.Transactions pode localizar uma transação de contexto de COM+, ele ainda favorece transações que são nativas do System.Transactions.
Níveis de interoperabilidade
O EnterpriseServicesInteropOption enumeração define os seguintes níveis de interoperabilidade —None, Full e Automatic.
O TransactionScope classe fornece construtores que aceitam EnterpriseServicesInteropOption como um parâmetro.
None, como o nome indica, implica que não há interoperabilidade entre contextos System.EnterpriseServices e escopos de transação. Depois de criar um TransactionScope objeto com None, todas as alterações Current não são refletidas no contexto de COM+. Da mesma forma, as alterações a transação no contexto de COM+ não são refletidas no Current. Este é o modo mais rápido de operação para System.Transactions porque não há nenhuma sincronização adicional necessária. None é o valor padrão usado por TransactionScope com todos os construtores que não aceitam EnterpriseServicesInteropOption como parâmetro.
Se você deseja combinar System.EnterpriseServices transações com sua transação de ambiente, você precisa usar um Full ou Automatic. Esses valores dependem de um recurso chamado serviços sem componentes e, portanto, você deve estar em execução no Windows XP Service Pack 2 ou Windows Server 2003 quando usá-los.
Full especifica que as transações de ambiente para System.Transactions e System.EnterpriseServices são sempre as mesmas. Isso resulta na criação de um novo System.EnterpriseServices contexto transacional e aplicando a transação atual para o TransactionScope atual para esse contexto. Como tal, a transação no Current é completamente em sincronia com a transação em Transaction. Esse valor apresenta uma penalidade de desempenho porque novos COM+ contextos precisa ser criado.
Automatic especifica os seguintes requisitos:
Quando Current estiver marcada, System.Transactions deve oferecer suporte a transações no contexto de COM+ se detectar que ele seja executado em um contexto diferente o contexto padrão. 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 pelo System.Transactions é retornado para Current.
Se um novo TransactionScope objeto é criado e a criação ocorre em um contexto diferente do contexto padrão, a transação atual para o TransactionScope objeto deve ser refletido no COM+. Nesse caso, Automatic se comporta como Full que ele cria um novo contexto de COM+.
Além disso quando Current é definido em ambos Full e Automatic, esses dois modos significam que Current não pode ser definida diretamente. Qualquer tentativa de definir Current diferente de criar diretamente uma TransactionScope resulta em uma InvalidOperationException. O EnterpriseServicesInteropOption valor de enumeração é herdada por novos escopos de transação que não especificar explicitamente o valor a ser usado. Por exemplo, se você criar um novo TransactionScope objeto com Fulle, em seguida, crie um segundo TransactionScope do objeto, mas não especificam um EnterpriseServicesInteropOption valor, a segunda TransactionScope objeto também tem um Full.
Em resumo, as seguintes regras se aplicam ao criar um novo escopo de transação:
Current é verificado para ver se há uma transação. Essa verificação resulta em:
Uma verificação para ver se há um escopo.
Se houver um escopo, o valor da EnterpriseServicesInteropOption enumeração passada quando o escopo foi criado inicialmente é verificada.
Se o EnterpriseServicesInteropOption enumeração é definida como Automatic, a transação COM+ (System.EnterpriseServices transação) tem precedência sobre o System.Transactions transações no armazenamento local de thread gerenciado.
Se o valor for definido como None, o System.Transactions transações no armazenamento local de thread gerenciado tem precedência.
Se o valor for Full, há somente uma transação e é uma transação COM+.
O valor da TransactionScopeOption enumeração passado pelo TransactionScope construtor é verificada. Determina se uma nova transação deve ser criada.
Se uma nova transação deve ser criado, os seguintes valores de EnterpriseServicesInteropOption resultar em:
Full: uma transação associada a um contexto COM+ é criada.
None: uma transação System.Transactions é criada.
Automatic: se houver um contexto COM+, uma transação será criada e anexada ao contexto.
A tabela a seguir ilustra o contexto do Enterprise Services (ES) e um escopo transacional que exige uma transação usando o EnterpriseServicesInteropOption enumeração.
Contexto de ES | Nenhum | Automática | Completo |
---|---|---|---|
Contexto padrão | Contexto padrão | Contexto padrão | Criar novo contexto transacional |
Contexto de não-padrão | Manter o contexto do cliente | Criar um novo contexto transacional | Criar um novo contexto transacional |
A tabela a seguir ilustra o que a transação ambiente é, dado um determinado System.EnterpriseServices contexto e um escopo transacional que exige uma transação usando o EnterpriseServicesInteropOption enumeração.
Contexto de ES | Nenhum | Automática | Completo |
---|---|---|---|
Contexto padrão | ST | ST | ES |
Contexto de não-padrão | ST | ES | ES |
Na tabela anterior:
ST significa que a transação de ambiente do escopo seja gerenciada por System.Transactionsseparada de qualquer System.EnterpriseServices transação do contexto que pode estar presente.
ES significa que a transação de ambiente do escopo é igual a System.EnterpriseServices transação do contexto.