Serviços e transações
Os aplicativos do Windows Communication Foundation (WCF) 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 e garantir que as operações de serviço sejam confirmadas ou revertidas como uma única unidade.
Você pode habilitar o comportamento da transação 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 de cliente. O parâmetro TransactionAutoComplete especifica se a transação na qual o método é executado será concluída automaticamente caso nenhuma exceção sem tratamento seja gerada. Para obter mais informações sobre esses atributos, consulte Atributos de transação do 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.
A amostra a seguir demonstra o uso e os 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 do WS-AtomicTransaction e definindo o elemento <transactionFlow> como true
, conforme mostrado na configuração de amostra 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 no escopo da transação.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}