Поделиться через


Службы и транзакции

Приложения Windows Communication Foundation (WCF) могут инициировать транзакцию из клиента и координировать ее в пределах операции службы. Клиенты могут инициировать транзакцию, вызвать несколько операций службы и обеспечить, чтобы операции службы либо фиксировались, либо откатывались как единый блок.

Чтобы включить поведение транзакции в контракте службы, укажите атрибут ServiceBehaviorAttribute и задайте его свойства TransactionIsolationLevel и TransactionScopeRequired для операций службы, для которых требуются клиентские транзакции. Параметр TransactionAutoComplete указывает, завершается ли автоматически транзакция, в которой выполняется метод, если необработанные исключения отсутствуют. Дополнительные сведения этих атрибутах см. в разделе Атрибуты транзакции ServiceModel.

Работа, выполняемая операциями службы и управляемая диспетчером ресурсов (например, ведение журнала обновления базы данных), является частью транзакции клиента.

В следующем образце показано использование атрибутов ServiceBehaviorAttribute и OperationBehaviorAttribute для управления поведением транзакций на стороне сервера.

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

}

Можно включить транзакции и поток транзакций, настроив привязки клиента и службы так, чтобы они использовали протокол WS-AtomicTransaction, и присвоив элементу <transactionFlow> значение true, как показано в следующем примере конфигурации.

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

Клиенты могут начинать транзакции путем создания TransactionScope и вызова операций службы в области транзакции.

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

См. также

Задачи

Поток транзакций WS

Основные понятия

Модели транзакций

Другие ресурсы

Поддержка транзакций в System.ServiceModel