Szolgáltatások és tranzakciók
A Windows Communication Foundation (WCF) alkalmazások kezdeményezhetnek tranzakciót egy ügyfélen belül, és koordinálhatják a tranzakciót a szolgáltatásműveleten belül. Az ügyfelek tranzakciót kezdeményezhetnek, és több szolgáltatásműveletet is meghívhatnak, és gondoskodhatnak arról, hogy a szolgáltatásműveletek véglegesítése vagy visszaállítása egyetlen egységként történjen.
A tranzakció viselkedését a szolgáltatási szerződésben úgy engedélyezheti, hogy megadja ServiceBehaviorAttribute az TransactionIsolationLevel ügyféltranzakciókat igénylő szolgáltatásműveletek tulajdonságait és TransactionScopeRequired tulajdonságait. A TransactionAutoComplete paraméter megadja, hogy a metódust végrehajtó tranzakció automatikusan befejeződik-e, ha nincsenek kezeletlen kivételek. További információ ezekről az attribútumokról: ServiceModel Transaction Attributes.
A szolgáltatásműveletek során elvégzett és egy erőforrás-kezelő által felügyelt munka, például az adatbázis-frissítések naplózása, az ügyfél tranzakciójának része.
Az alábbi minta a szolgáltatásoldali tranzakció viselkedésének szabályozására ServiceBehaviorAttribute szolgáló attribútumok és OperationBehaviorAttribute attribútumok használatát mutatja be.
[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;
}
}
A tranzakciókat és a tranzakciós folyamatot úgy engedélyezheti, hogy konfigurálja az ügyfél- és szolgáltatáskötéseket a WS-AtomicTransaction protokoll használatára, és a <transactionFlow> elemet a következő mintakonfigurációban látható értékre true
állítja.
<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>
Az ügyfelek úgy kezdhetik meg a tranzakciót, hogy létrehoznak egy TransactionScope , a tranzakció hatókörébe tartozó szolgáltatásműveleteket.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}