Dienste und Transaktionen

Windows Communication Foundation (WCF)-Anwendungen können von einem Client aus eine Transaktion initiieren und die Transaktion innerhalb der Dienstvorgänge koordinieren. Clients können eine Transaktion initiieren und mehrere Dienstvorgänge aufrufen und sicherstellen, dass für die Dienstvorgänge entweder ein Commit oder ein Rollback als einzelne Einheit ausgeführt wurde.

Sie können das Transaktionsverhalten im Dienstvertrag aktivieren, indem Sie ein ServiceBehaviorAttribute festlegen und die TransactionIsolationLevel-Eigenschaft und die TransactionScopeRequired-Eigenschaft für Dienstvorgänge, die Clienttransaktionen benötigen, festlegen. Der TransactionAutoComplete-Parameter legt fest, ob die Transaktion, in der die Methode ausgeführt wird, automatisch abgeschlossen wird, wenn keine unbehandelten Ausnahmen ausgelöst werden. Weitere Informationen zu diesen Attributen finden Sie unter ServiceModel-Transaktionsattribute.

Die Aufgaben (z. B. die Protokollierung von Datenbankupdates), die in den Dienstvorgängen ausgeführt und von einem Ressourcenmanager verwaltet werden, sind Teil der Clienttransaktionen.

Das folgende Beispiel veranschaulicht die Nutzung der ServiceBehaviorAttribute-Attribute und OperationBehaviorAttribute-Attribute bei der Steuerung des Transaktionsverhalten aufseiten des Dienstes.

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

Sie können Transaktionen und Transaktionsfluss aktivieren, indem Sie die Client- und Dienstbindungen so konfigurieren, dass sie das WS-AtomicTransaction-Protokoll verwenden, und das Element <transactionFlow> auf true setzen, wie in der folgenden Beispielkonfiguration gezeigt.

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

Clients können eine Transaktion starten, indem Sie TransactionScope erstellen und Dienstvorgänge im Transaktionsumfang aufrufen.

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

Siehe auch