Службы и транзакции
Приложения 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($"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;
}
}
Вы можете включить транзакции и поток транзакций, настроив привязки клиента и службы для использования протокола 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();
}