Compartilhar via


Serviços e transações

Os aplicativos do WCF (Windows Communication Foundation) podem iniciar uma transação de dentro de um cliente e coordenar a transação dentro da operação de serviço. Os clientes podem iniciar uma transação e invocar várias operações de serviço, garantindo que, como uma única unidade, as operações de serviço sejam confirmadas ou revertidas.

Você pode ativar o comportamento transacional no contrato de serviço especificando um ServiceBehaviorAttribute e definindo suas propriedades TransactionIsolationLevel e TransactionScopeRequired para operações de serviço que exigem transações realizadas pelo cliente. O TransactionAutoComplete parâmetro especifica se a transação na qual o método é executado será concluída automaticamente se nenhuma exceção sem tratamento for gerada. Para obter mais informações sobre esses atributos, consulte Atributos de transação ServiceModel.

O trabalho executado nas operações de serviço e gerenciado por um gerenciador de recursos, como o registro em log de atualizações de banco de dados, faz parte da transação do cliente.

O exemplo a seguir demonstra o uso dos atributos ServiceBehaviorAttribute e OperationBehaviorAttribute para controlar o comportamento da transação do lado do serviço.

[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]  
public class CalculatorService: ICalculatorLog  
{  
    [OperationBehavior(TransactionScopeRequired = true,  
                           TransactionAutoComplete = true)]  
    public double Add(double n1, double n2)  
    {  
        recordToLog($"Added {n1} to {n2}");
        return n1 + n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                               TransactionAutoComplete = true)]  
    public double Subtract(double n1, double n2)  
    {  
        recordToLog($"Subtracted {n1} from {n2}");
        return n1 - n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                                       TransactionAutoComplete = true)]  
    public double Multiply(double n1, double n2)  
    {  
        recordToLog($"Multiplied {n1} by {n2}");
        return n1 * n2;  
    }  
  
    [OperationBehavior(TransactionScopeRequired = true,
                                       TransactionAutoComplete = true)]  
    public double Divide(double n1, double n2)  
    {  
        recordToLog($"Divided {n1} by {n2}", n1, n2);
        return n1 / n2;  
    }  
  
}  

Você pode habilitar transações e fluxo de transações configurando as associações de cliente e serviço para usar o protocolo WS-AtomicTransaction e definindo o <elemento transactionFlow> como true, conforme mostrado na configuração de exemplo a seguir.

<client>  
    <endpoint address="net.tcp://localhost/ServiceModelSamples/service"
          binding="netTcpBinding"
          bindingConfiguration="netTcpBindingWSAT"
          contract="Microsoft.ServiceModel.Samples.ICalculatorLog" />  
</client>  
  
<bindings>  
    <netTcpBinding>  
        <binding name="netTcpBindingWSAT"  
                transactionFlow="true"  
                transactionProtocol="WSAtomicTransactionOctober2004" />  
     </netTcpBinding>  
</bindings>  

Os clientes podem iniciar uma transação criando um TransactionScope e invocando operações de serviço dentro do escopo da transação.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))  
{  
    //Do work here  
    ts.Complete();  
}  

Consulte também