Partilhar via


Atributos de transação ServiceModel

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

TransactionFlowAttribute

O TransactionFlowAttribute atributo 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 TransactionFlowOption enumeração para especificar se uma transação de entrada é Mandatory, Allowedou NotAllowed.

Este é 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 referem-se ao uso de transações dentro da execução da operação.

ServiceBehaviorAttribute

O ServiceBehaviorAttribute atributo 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 deve ser concluída quando a sessão for encerrada. O valor padrão para essa propriedade é false. Se essa propriedade for true, e a sessão de entrada tiver sido encerrada normalmente em vez de fechar devido a falhas de rede ou cliente, qualquer transação não concluída será concluída com êxito. Caso contrário, se essa propriedade for false ou se a sessão não tiver sido fechada normalmente, qualquer transação não concluída será revertida quando a sessão for fechada. Se essa propriedade for true, o canal de entrada deve 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 para essa 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. Liberar uma instância de serviço é uma ação interna que o serviço executa e não tem impacto em quaisquer conexões ou sessões existentes que os clientes possam ter estabelecido. Essa funcionalidade é equivalente ao recurso de ativação just-in-time fornecido pelo COM+. Se a propriedade for true, ConcurrencyMode deve ser igual a Single. Caso contrário, o serviço lançará 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; Esta propriedade usa um dos IsolationLevel valores. Se a propriedade de nível de isolamento local for diferente Unspecifiedde , 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 ao cliente. Se TransactionScopeRequired for true, e nenhuma transação for fluída, essa propriedade determinará o IsolationLevel valor a ser usado para a transação criada localmente. Se IsolationLevel estiver definido como Unspecified, IsolationLevelSerializable é usado.

  • TransactionTimeout Especifica o período de tempo dentro do 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á abortada. O TimeSpan é usado como o TransactionScope tempo limite para todas as operações que foram TransactionScopeRequired definidas e true para as quais uma nova transação foi 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 de duas fases. O valor de tempo limite usado é sempre o menor valor entre a TransactionTimeout propriedade e a definição de transactionTimeout configuração.

OperationBehaviorAttribute

O OperationBehaviorAttribute atributo 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 WSDL (Web Service Description Language) do contrato de serviço e são puramente elementos do modelo de programação WCF que permitem recursos comuns que os desenvolvedores precisam implementar por conta própria.

Este 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 ativa. A predefinição é false. Se o OperationBehaviorAttribute atributo 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 IncomingMessagePropertiesOperationContext. 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 é fluída do cliente, o método é executado sob um escopo de transação criado usando essa transação distribuída.

    • Com um transporte em fila, a transação usada para retirar a mensagem da fila é 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 através do uso do TransportTransactionProperty.

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

  • TransactionAutoComplete Especifica se a transação na qual o método é executado é concluída automaticamente se nenhuma exceção não tratada for lançada. 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 lançar 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 SetTransactionCompleteexplicitamente . A falha em executar qualquer um desses resultados na transação nunca será "concluída" e o trabalho contido não será confirmado, a menos que a TransactionAutoCompleteOnSessionClose propriedade esteja definida como true. Se essa propriedade estiver definida como true, você deverá usar um canal com uma sessão e a InstanceContextMode deverá ser definida como PerSession.