Condividi tramite


Servizi e transazioni

Le applicazioni di WCF (Windows Communication Foundation) 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 in cui viene eseguito il metodo viene completata automaticamente nel caso in cui non venga generata alcuna eccezione non gestita. Per altre informazioni su questi attributi, vedere Attributi delle transazioni 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($"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;  
    }  
  
}  

È 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();  
}  

Vedi anche