Servizi e transazioni

Le applicazioni di Windows Communication Foundation (WCF) possono avviare una transazione dall'interno di un client e coordinarla all'interno dell'operazione di servizio. I client possono avviare una transazione e richiamare varie operazioni di servizio nonché fare in modo che per queste ultime venga eseguito il commit o il rollback come unità singola.

È possibile attivare il comportamento della transazione nel contratto di servizio specificando un elemento ServiceBehaviorAttribute e impostando le proprietà TransactionIsolationLevel e TransactionScopeRequired per operazioni di servizio che richiedono transazioni client. Il parametro TransactionAutoComplete specifica se la transazione nella quale viene eseguito il metodo viene completata automaticamente nel caso in cui vengano generate eccezioni non gestite. Per ulteriori informazioni su questi attributi, vedere Attributi della transazione di ServiceModel.

Il lavoro eseguito nelle operazioni di servizio e curato da un gestore di risorse, ad esempio la registrazione di aggiornamenti del database, fa parte della transazione del client.

Nell'esempio seguente viene dimostrato l'utilizzo degli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute per controllare il comportamento della transazione dal lato del servizio.

[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService: ICalculatorLog
{
    [OperationBehavior(TransactionScopeRequired = true,
                           TransactionAutoComplete = true)]
    public double Add(double n1, double n2)
    {
        recordToLog(String.Format("Added {0} to {1}", n1, n2));
        return n1 + n2;
    }

    [OperationBehavior(TransactionScopeRequired = true, 
                               TransactionAutoComplete = true)]
    public double Subtract(double n1, double n2)
    {
        recordToLog(String.Format("Subtracted {0} from {1}", n1, n2));
        return n1 - n2;
    }

    [OperationBehavior(TransactionScopeRequired = true, 
                                       TransactionAutoComplete = true)]
    public double Multiply(double n1, double n2)
    {
        recordToLog(String.Format("Multiplied {0} by {1}", n1, n2));
        return n1 * n2;
    }

    [OperationBehavior(TransactionScopeRequired = true, 
                                       TransactionAutoComplete = true)]
    public double Divide(double n1, double n2)
    {
        recordToLog(String.Format("Divided {0} by {1}", n1, n2));
        return n1 / n2;
    }

}

È possibile attivare transazioni e propagazione transazionale configurando le associazioni client e di servizio per l'utilizzo del protocollo WS-AtomicTransaction e impostando l'elemento <transactionFlow> su true, come illustrato nella configurazione di esempio seguente.

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

I client possono iniziare una transazione creando un elemento TransactionScope e richiamando operazioni di servizio nell'ambito della transazione.

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

Vedere anche

Concetti

Modelli di transazione

Altre risorse

Supporto transazionale in System.ServiceModel
WS Transaction Flow