Usługi i transakcje
Aplikacje programu Windows Communication Foundation (WCF) mogą inicjować transakcję z poziomu klienta i koordynować transakcję w ramach operacji usługi. Klienci mogą zainicjować transakcję i wywołać kilka operacji usługi i upewnić się, że operacje usługi są zatwierdzone lub wycofane jako pojedyncza jednostka.
Zachowanie transakcji w kontrakcie usługi można włączyć, określając i ustawiając ServiceBehaviorAttribute jego TransactionIsolationLevel właściwości i TransactionScopeRequired dla operacji usługi, które wymagają transakcji klienta. Parametr TransactionAutoComplete określa, czy transakcja, w której metoda jest wykonywana automatycznie, jeśli nie są zgłaszane nieobsługiwane wyjątki. Aby uzyskać więcej informacji na temat tych atrybutów, zobacz ServiceModel Transaction Attributes (Atrybuty transakcji modelu ServiceModel).
Praca wykonywana w operacjach usługi i zarządzana przez menedżera zasobów, na przykład rejestrowanie aktualizacji bazy danych, jest częścią transakcji klienta.
W poniższym przykładzie pokazano użycie ServiceBehaviorAttribute atrybutów i OperationBehaviorAttribute do kontrolowania zachowania transakcji po stronie usługi.
[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;
}
}
Transakcje i przepływ transakcji można włączyć, konfigurując powiązania klienta i usługi w celu używania protokołu WS-AtomicTransaction, a następnie ustawiając <element transactionFlow> na true
wartość , jak pokazano w poniższej przykładowej konfiguracji.
<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>
Klienci mogą rozpocząć transakcję, tworząc TransactionScope operacje usługi i wywołując je w zakresie transakcji.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}