Compartir a través de


Servicios y transacciones

Las aplicaciones de Windows Communication Foundation (WCF) pueden iniciar una transacción desde un cliente y coordinar la transacción dentro de la operación de servicio. Los clientes pueden iniciar una transacción e invocación varias operaciones del servicio y garantizar que las operaciones del servicio se confirmen o reviertan como una unidad única.

Puede habilitar el comportamiento de transacción en el contrato de servicio especificando un ServiceBehaviorAttribute y estableciendo sus propiedades TransactionIsolationLevel y TransactionScopeRequired para las operaciones de servicio que requieren transacciones del cliente. El parámetro TransactionAutoComplete especifica si la transacción en la que se ejecuta el método se completa automáticamente si no se lanzan excepciones no controladas. Para obtener más información sobre estos atributos, vea Atributos de transacción de ServiceModel.

El trabajo que se realiza en las operaciones del servicio y que administra un administrador de recursos, como el registro de actualizaciones de la base de datos, forma parte de la transacción del cliente.

En el ejemplo siguiente se muestra el uso de los ServiceBehaviorAttribute atributos y OperationBehaviorAttribute para controlar el comportamiento de las transacciones del lado del servicio.

[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;  
    }  
  
}  

Puede habilitar transacciones y el flujo de transacción configurando los enlaces de cliente y servicio para usar el protocolo WS-AtomicTransaction y estableciendo el <elemento transactionFlow> en true, como se muestra en la siguiente configuración de ejemplo.

<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>  

Los clientes pueden comenzar una transacción al crear un TransactionScope e invocar operaciones de servicio dentro del ámbito de la transacción.

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

Consulte también