Služby a transakce

Aplikace wcf (Windows Communication Foundation) mohou zahájit transakci z klienta a koordinovat transakci v rámci operace služby. Klienti mohou zahájit transakci a vyvolat několik operací služby a zajistit, aby operace služby byly potvrzeny nebo vráceny zpět jako jedna jednotka.

Chování transakce ve smlouvě služby můžete povolit zadáním ServiceBehaviorAttribute a nastavením jeho TransactionIsolationLevel a TransactionScopeRequired vlastností pro operace služby, které vyžadují klientské transakce. Parametr TransactionAutoComplete určuje, zda transakce, ve které se metoda spouští, je automaticky dokončena, pokud nejsou vyvolány žádné neošetřené výjimky. Další informace o těchto atributech naleznete v tématu ServiceModel Transaction Attributes.

Práce prováděná v operacích služby a spravovaná správcem prostředků, jako jsou aktualizace protokolování databáze, je součástí transakce klienta.

Následující ukázka ukazuje použití ServiceBehaviorAttribute atributů OperationBehaviorAttribute k řízení chování transakcí na straně služby.

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

}

Transakce a tok transakcí můžete povolit tak, že nakonfigurujete vazby klienta a služby tak, aby používaly protokol WS-AtomicTransaction, a nastavením <elementu transactionFlow> na true, jak je znázorněno v následující ukázkové konfiguraci.

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

Klienti mohou zahájit transakci vytvořením TransactionScope a vyvoláním operací služby v rámci rozsahu transakce.

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

Viz také