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