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 fortrue
, 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 forfalse
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 fortrue
, 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 fortrue
, 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 detransactionTimeout
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 forfalse
, 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 atrue
, 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 comotrue
. Se essa propriedade estiver definida comotrue
, você deverá usar um canal com uma sessão e a InstanceContextMode deverá ser definida como PerSession.