Freigeben über


Dienste und Transaktionen

Windows Communication Foundation (WCF)-Anwendungen können eine Transaktion aus einem Client initiieren und die Transaktion im Dienstvorgang 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 gibt an, ob die Transaktion, in der die Methode ausgeführt wird, automatisch abgeschlossen wird, wenn keine Ausnahmefehler ausgegeben werden. Weitere Informationen über 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(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;
    }

}

Sie können Transaktionen und Transaktionsflüsse aktivieren, indem Sie die Clientbindungen und Dienstbindungen konfigurieren, um das WS-AtomicTransaction-Protokoll zu verwenden, und indem Sie das <transactionFlow>true-Element auf festlegen, wie in der folgenden Beispielkonfiguration dargestellt wird.

<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

Aufgaben

WS-Transaktionsfluss

Konzepte

Transaktionsmodelle

Weitere Ressourcen

Transaktionsunterstützung in System.ServiceModel