Compartilhar via


Atributos de transação de ServiceModel

O WCF (Windows Communication Foundation) fornece propriedades em três atributos System.ServiceModel padrão que permitem configurar o comportamento das transações para um serviço WCF:

TransactionFlowAttribute

O atributo TransactionFlowAttribute especifica a disposição de uma operação em um contrato de serviço para aceitar transações de entrada de um cliente. O atributo fornece esse controle com a seguinte propriedade: as transações usam a enumeração TransactionFlowOption para especificar se uma transação de entrada é Mandatory, Allowed ou NotAllowed.

Esse é o único atributo que relaciona operações de serviço a interações externas com um cliente. Os atributos descritos nas seções a seguir se referem ao uso de transações dentro da execução da operação.

ServiceBehaviorAttribute

O atributo ServiceBehaviorAttribute especifica o comportamento de execução interna de uma implementação de contrato de serviço. As propriedades específicas da transação desse atributo incluem:

  • TransactionAutoCompleteOnSessionClose especifica se uma transação não concluída será concluída quando a sessão for fechada. O valor padrão desta propriedade é false. Se essa propriedade for true e a sessão de entrada tiver sido normalmente desligada em vez de fechar devido a falhas de rede ou cliente, qualquer transação não computada será concluída com êxito. Caso contrário, se essa propriedade for false ou se a sessão não tiver sido normalmente fechada, qualquer transação não concluída será revertida quando a sessão for fechada. Se essa propriedade for true, o canal de entrada deverá ser baseado em sessão.

  • ReleaseServiceInstanceOnTransactionComplete especifica se a instância de serviço subjacente é liberada quando uma transação é concluída. O valor padrão desta propriedade é true. A próxima mensagem de entrada faz com que uma nova instância subjacente seja criada, descartando qualquer estado por transação que a instância anterior possa ter mantido. A liberação de uma instância de serviço é uma ação interna que o serviço realiza e não tem impacto em nenhuma conexão ou sessão existente que os clientes possam ter estabelecido. Essa funcionalidade é equivalente ao recurso de ativação just-in-time que o COM+ fornece. Se a propriedade for true, ConcurrencyMode deverá ser igual a Single. Caso contrário, o serviço gera uma exceção de validação de configuração inválida durante a inicialização.

  • TransactionIsolationLevel especifica o nível de isolamento a ser usado para transações dentro do serviço. Essa propriedade usa um dos valores IsolationLevel. Se a propriedade de nível de isolamento local for diferente de Unspecified, o nível de isolamento de uma transação de entrada deverá corresponder à configuração dessa propriedade local. Caso contrário, a transação de entrada é rejeitada e uma falha é enviada de volta para o cliente. Se TransactionScopeRequired for true, e nenhuma transação for fluida, essa propriedade determinará o valor IsolationLevel a ser usado para a transação criada localmente. Se IsolationLevel estiver definido como Unspecified, IsolationLevelSerializable será usado.

  • TransactionTimeout especifica o período de tempo no qual uma nova transação criada no serviço deve ser concluída. Se esse tempo for atingido e a transação não tiver sido concluída, ela será anulada. O TimeSpan é usado como o tempo limite TransactionScope para todas as operações que têm TransactionScopeRequired definido como true e para as quais uma nova transação tenha sido criada. O tempo limite é a duração máxima permitida desde a criação da transação até a conclusão da fase 1 no protocolo de confirmação em duas fases. O valor de tempo limite usado é sempre o valor mais baixo entre a propriedade TransactionTimeout e a configuração transactionTimeout.

OperationBehaviorAttribute

O atributo OperationBehaviorAttribute especifica os comportamentos dos métodos na implementação do serviço. Você pode usá-lo para indicar o comportamento de execução específico da operação. As propriedades desse atributo não afetam a descrição de WSDL (linguagem de descrição do serviço Web) do contrato de serviço e são puramente elementos do modelo de programação do WCF que permitem recursos comuns que os desenvolvedores precisam implementar sozinhos.

Esse atributo tem as seguintes propriedades específicas da transação:

  • TransactionScopeRequired especifica se um método deve ser executado dentro de um escopo de transação ativo. O padrão é false. Se o atributo OperationBehaviorAttribute não estiver definido para um método, isso também implica que o método não será executado em uma transação. Se um escopo de transação não for necessário para uma operação, qualquer transação presente no cabeçalho da mensagem não será ativada e permanecerá como um elemento do IncomingMessageProperties do OperationContext. Se um escopo de transação for necessário para uma operação, a origem da transação será derivada de um dos seguintes:

    • Se uma transação fluir do cliente, o método será executado em um escopo de transação criado usando essa transação distribuída.

    • Com um transporte na fila, a transação utilizada para desativar a mensagem é usada. Observe que a transação usada não é uma transação fluída, pois não foi fornecida pelo remetente original da mensagem.

    • Um transporte personalizado pode fornecer uma transação por meio do uso do TransportTransactionProperty.

    • Se nenhum dos acima fornecer uma fonte externa para uma transação, uma nova instância Transaction será criada imediatamente antes de chamar o método.

  • TransactionAutoComplete especifica se a transação na qual o método é executado será concluída automaticamente caso nenhuma exceção sem tratamento seja gerada. Se essa propriedade for true, a infraestrutura de chamada marcará automaticamente a transação como "concluída" se o método de usuário retornar sem gerar uma exceção. Se essa propriedade for false, a transação será anexada à instância e só será marcada como "concluída" se o cliente chamar um método subsequente marcado com essa propriedade igual a true, ou se um método subsequente chamar SetTransactionComplete explicitamente. Falha ao executar qualquer um desses resultados na transação que nunca foi "concluída" e o trabalho contido não será confirmado, a menos que a propriedade TransactionAutoCompleteOnSessionClose esteja definida como true. Se essa propriedade estiver definida como true, você deverá usar um canal com uma sessão e o valor InstanceContextMode deverá ser definido como PerSession.