WS-tranzakciós folyamat
A TransactionFlow minta bemutatja az ügyfél által koordinált tranzakciót, valamint az ügyfél- és kiszolgálóbeállításokat a tranzakciófolyamathoz a WS-Atomic Transaction vagy az OleTransactions protokoll használatával. Ez a minta a Első lépések-re alapul, amely egy számológép szolgáltatást valósít meg, de a műveletek a TransactionFlowAttribute
a TransactionFlowOption enumerációval való használatát szemléltetik annak megállapítására, hogy milyen mértékben van engedélyezve a tranzakciós folyamat. A tranzakció hatókörén belül a rendszer egy adatbázisba írja a kért műveletek naplóját, és az ügyfél által koordinált tranzakció befejezéséig megőrzi azt – ha az ügyféltranzakció nem fejeződik be, a webszolgáltatás tranzakciója biztosítja, hogy az adatbázis megfelelő frissítései ne legyenek véglegesítve.
Jegyzet
A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.
A szolgáltatáshoz és egy tranzakcióhoz való csatlakozás kezdeményezése után az ügyfél több szolgáltatásművelethez is hozzáfér. A szolgáltatásra vonatkozó szerződés az alábbiak szerint van definiálva, az egyes műveletek eltérő beállítást mutatnak be a TransactionFlowOption
-ra vonatkozóan.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Add(double n1, double n2);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
double Subtract(double n1, double n2);
[OperationContract]
[TransactionFlow(TransactionFlowOption.NotAllowed)]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
Ez a feldolgozásuk sorrendjében határozza meg a műveleteket:
A
Add
műveleti kérelemnek tartalmaznia kell egy tranzakciót.Egy
Subtract
műveletkérés tartalmazhat egy tranzakciót.A
Multiply
műveletkérelem nem tartalmazhat folyó tranzakciót az explicit NotAllowed beállításon keresztül.A
Divide
műveletkérelem nem tartalmazhatTransactionFlow
attribútum kihagyásával végrehajtott tranzakciót.
A tranzakciós folyamat engedélyezéséhez a <transactionFlow> tulajdonsággal rendelkező kötéseket a megfelelő műveleti attribútumok mellett kell használni. Ebben a példában a szolgáltatás konfigurációja egy TCP-végpontot és egy HTTP-végpontot tesz elérhetővé a Metaadat Exchange-végpont mellett. A TCP-végpont és a HTTP-végpont a következő kötéseket használja, amelyeknél engedélyezve van a <transactionFlow> tulajdonság.
<bindings>
<netTcpBinding>
<binding name="transactionalOleTransactionsTcpBinding"
transactionFlow="true"
transactionProtocol="OleTransactions"/>
</netTcpBinding>
<wsHttpBinding>
<binding name="transactionalWsatHttpBinding"
transactionFlow="true" />
</wsHttpBinding>
</bindings>
Jegyzet
A rendszer által biztosított netTcpBinding lehetővé teszi a transactionProtocol specifikációját, míg a rendszer által biztosított wsHttpBinding csak az interoperábilisabb WSAtomicTransactionOctober2004 protokollt használja. Az OleTransactions protokoll csak a Windows Communication Foundation (WCF) ügyfelei számára érhető el.
A ICalculator
interfészt megvalósító osztályban minden metódus true
értékre van beállítva a TransactionScopeRequired tulajdonsággal. Ez a beállítás azt deklarálja, hogy a metóduson belül végrehajtott összes művelet egy tranzakció hatókörén belül történik. Ebben az esetben a végrehajtott műveletek közé tartozik a naplóadatbázisba való felvétel. Ha a műveleti kérelem tartalmaz egy tranzakciót, akkor a művelet a bejövő tranzakció hatókörén belül történik, vagy automatikusan létrejön egy új tranzakció hatóköre.
Jegyzet
A TransactionScopeRequired tulajdonság helyi viselkedést határoz meg a szolgáltatásmetódus implementációihoz, és nem határozza meg az ügyfél tranzakcióhoz való képességét vagy követelményét.
// Service class that implements the service contract.
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService : ICalculator
{
[OperationBehavior(TransactionScopeRequired = true)]
public double Add(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Adding {0} to {1}", n1, n2));
return n1 + n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Subtract(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Subtracting {0} from {1}", n2, n1));
return n1 - n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Multiply(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Multiplying {0} by {1}", n1, n2));
return n1 * n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Divide(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Dividing {0} by {1}", n1, n2));
return n1 / n2;
}
// Logging method omitted for brevity
}
Az ügyfélnél a szolgáltatás TransactionFlowOption
beállításai tükröződnek a ICalculator
interfész ügyfél által generált definíciójában. Emellett a szolgáltatás transactionFlow
tulajdonságbeállításai is megjelennek az ügyfél alkalmazáskonfigurációjában. Az ügyfél a megfelelő endpointConfigurationName
kiválasztásával kiválaszthatja az átvitelt és a protokollt.
// Create a client using either wsat or oletx endpoint configurations
CalculatorClient client = new CalculatorClient("WSAtomicTransaction_endpoint");
// CalculatorClient client = new CalculatorClient("OleTransactions_endpoint");
Jegyzet
A minta megfigyelt viselkedése ugyanaz, függetlenül attól, hogy melyik protokollt vagy átvitelt választja.
A szolgáltatáshoz való csatlakozást megkezdve az ügyfél új TransactionScope
-t hoz létre a szolgáltatás műveleteinek hívásai körül.
// Start a transaction scope
using (TransactionScope tx =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
Console.WriteLine("Starting transaction");
// Call the Add service operation
// - generatedClient will flow the required active transaction
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine(" Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation
// - generatedClient will flow the allowed active transaction
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine(" Subtract({0},{1}) = {2}", value1, value2, result);
// Start a transaction scope that suppresses the current transaction
using (TransactionScope txSuppress =
new TransactionScope(TransactionScopeOption.Suppress))
{
// Call the Subtract service operation
// - the active transaction is suppressed from the generatedClient
// and no transaction will flow
value1 = 21.05D;
value2 = 42.16D;
result = client.Subtract(value1, value2);
Console.WriteLine(" Subtract({0},{1}) = {2}", value1, value2, result);
// Complete the suppressed scope
txSuppress.Complete();
}
// Call the Multiply service operation
// - generatedClient will not flow the active transaction
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine(" Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
// - generatedClient will not flow the active transaction
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine(" Divide({0},{1}) = {2}", value1, value2, result);
// Complete the transaction scope
Console.WriteLine(" Completing transaction");
tx.Complete();
}
Console.WriteLine("Transaction committed");
A műveletek hívásai a következők:
A
Add
kérés a szükséges tranzakciót a szolgáltatásba folyamozza, és a szolgáltatás műveletei az ügyfél tranzakciójának hatókörén belül történnek.Az első
Subtract
kérés az engedélyezett tranzakciót is a szolgáltatásba folyamozza, és a szolgáltatás műveletei ismét az ügyfél tranzakciójának hatókörén belül történnek.A második
Subtract
kérés aTransactionScopeOption.Suppress
beállítással deklarált új tranzakciós hatókörön belül lesz végrehajtva. Ez letiltja az ügyfél kezdeti külső tranzakcióját, és a kérés nem küld tranzakciót a szolgáltatásnak. Ez a megközelítés lehetővé teszi az ügyfél számára, hogy explicit módon letiltsa a tranzakciót, és védelmet nyújtson a szolgáltatásba irányuló tranzakciók ellen, ha ez nem szükséges. A szolgáltatás műveletei egy új és nem összekapcsolt tranzakció hatókörén belül történnek.A
Multiply
kérés nem küld tranzakciót a szolgáltatásnak, mert az ügyfél által létrehozottICalculator
felület definíciója tartalmaz egy TransactionFlowAttributeTransactionFlowOptionNotAllowed
.A
Divide
kérés nem küld tranzakciót a szolgáltatásnak, mert aICalculator
felület ügyfél által létrehozott definíciója nem tartalmazTransactionFlowAttribute
. A szolgáltatás műveletei ismét egy másik új és nem összekapcsolt tranzakció hatókörén belül történnek.
A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.
Starting transaction
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Subtract(21.05,42.16) = -21.11
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Completing transaction
Transaction committed
Press <ENTER> to terminate client.
A szolgáltatásműveleti kérelmek naplózása a szolgáltatás konzolablakában jelenik meg. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.
Press <ENTER> to terminate the service.
Writing row to database: Adding 100 to 15.99
Writing row to database: Subtracting 76.54 from 145
Writing row to database: Subtracting 42.16 from 21.05
Writing row to database: Multiplying 9 by 81.25
Writing row to database: Dividing 22 by 7
A sikeres végrehajtás után az ügyfél tranzakciós hatóköre befejeződik, és az adott hatókörben végrehajtott összes művelet véglegesítésre kerül. Pontosabban az 5 rekord megmarad a szolgáltatás adatbázisában. Ezek közül az első 2 az ügyfél tranzakciójának hatókörén belül történt.
Ha bárhol kivétel történik az ügyfél TransactionScope
-ban, a tranzakció nem fejezhető be. Ez azt eredményezi, hogy a hatókörön belül naplózott rekordok nem lesznek lekötöttek az adatbázishoz. Ez a hatás a mintafuttatás megismétlésével figyelhető meg, miután kikommentelte a hívást, amely befejezi a külső TransactionScope
-t. Ilyen futtatás esetén a rendszer csak az utolsó 3 műveletet naplózza (a második Subtract
, a Multiply
és a Divide
kéréseket), mert az ügyféltranzakció nem jutott el ezekhez.
A minta összeállítása, beállítása és futtatása
A megoldás C# vagy Visual Basic .NET-verziójának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
Győződjön meg arról, hogy telepítette az SQL Server Express Editiont vagy az SQL Servert, és hogy a kapcsolati sztring megfelelően lett beállítva a szolgáltatás alkalmazáskonfigurációs fájljában. Ha adatbázis használata nélkül szeretné futtatni a mintát, állítsa a szolgáltatás alkalmazáskonfigurációs fájljának
usingSql
értékétfalse
értékre.Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.
Jegyzet
Gépközi konfiguráció esetén engedélyezze az elosztott tranzakció koordinátorát az alábbi utasítások alapján, és használja a Windows SDK WsatConfig.exe eszközét a WCF-tranzakciók hálózati támogatásának engedélyezéséhez. A WsatConfig.exebeállításával kapcsolatos információkért lásd: WS-Atomic Tranzakciótámogatásikonfigurálása.
Akár ugyanazon a számítógépen, akár különböző számítógépeken futtatja a mintát, konfigurálnia kell a Microsoft Distributed Transaction Coordinatort (MSDTC) a hálózati tranzakciók folyamatának engedélyezéséhez, és a WsatConfig.exe eszközzel engedélyeznie kell a WCF-tranzakciók hálózati támogatását.
A Microsoft Distributed Transaction Coordinator (MSDTC) konfigurálása a minta futtatásának támogatásához
Windows Server 2003 vagy Windows XP rendszert futtató szolgáltatásgépen konfigurálja az MSDTC-t a bejövő hálózati tranzakciók engedélyezésére az alábbi utasítások követésével.
A Start menüben lépjen be a Vezérlőpult, majd a Felügyeleti eszközök, végül pedig a Szolgáltatások összetevői.
Bővítse Component Services. Nyissa meg a Számítógépek mappát.
Kattintson a jobb gombbal Saját számítógép elemre, és válassza a Tulajdonságoklehetőséget.
Az MSDTC lapon kattintson Biztonsági konfigurációelemre.
Ellenőrizze hálózati DTC-hozzáférési és Bejövőengedélyezése lehetőséget.
Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.
Kattintson OK gombra a párbeszédpanel bezárásához.
Windows Server 2008 vagy Windows Vista rendszerű szolgáltatásgépen konfigurálja az MSDTC-t a bejövő hálózati tranzakciók engedélyezésére az alábbi utasítások követésével.
A Start menüben lépjen a Vezérlőpult, majd a Felügyeleti eszközök, majd a Szolgáltatáskezeléspontra.
Nyissa meg Component Services. Nyissa meg a Számítógépek mappát. Válassza Elosztott tranzakció koordinátorlehetőséget.
Kattintson a jobb gombbal DTC-koordinátor, és válassza a Tulajdonságoklehetőséget.
A Biztonsági lapon ellenőrizze Hálózati DTC-hozzáférés és Bejövőengedélyezése lehetőséget.
Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.
Kattintson OK gombra a párbeszédpanel bezárásához.
Az ügyfélszámítógépen konfigurálja az MSDTC-t a kimenő hálózati tranzakciók engedélyezéséhez:
A Start menüben lépjen a
Control Panel
, majd a Felügyeleti eszközök, és végül a Szolgáltatáskezelőpontra.Kattintson a jobb gombbal Saját számítógép elemre, és válassza a Tulajdonságoklehetőséget.
Az MSDTC lapon kattintson Biztonsági konfigurációelemre.
Ellenőrizze a hálózati DTC-hozzáférést és engedélyezze a kimenő-at.
Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.
Kattintson OK gombra a párbeszédpanel bezárásához.