Megosztás a következőn keresztül:


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 tartalmazhat TransactionFlow 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ő endpointConfigurationNamekivá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 a TransactionScopeOption.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étrehozott ICalculator felület definíciója tartalmaz egy TransactionFlowAttributeTransactionFlowOptionNotAllowed.

  • A Divide kérés nem küld tranzakciót a szolgáltatásnak, mert a ICalculator felület ügyfél által létrehozott definíciója nem tartalmaz TransactionFlowAttribute. 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

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

  2. 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ét falseértékre.

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

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

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

    2. Bővítse Component Services. Nyissa meg a Számítógépek mappát.

    3. Kattintson a jobb gombbal Saját számítógép elemre, és válassza a Tulajdonságoklehetőséget.

    4. Az MSDTC lapon kattintson Biztonsági konfigurációelemre.

    5. Ellenőrizze hálózati DTC-hozzáférési és Bejövőengedélyezése lehetőséget.

    6. Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.

    7. Kattintson OK gombra a párbeszédpanel bezárásához.

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

    1. A Start menüben lépjen a Vezérlőpult, majd a Felügyeleti eszközök, majd a Szolgáltatáskezeléspontra.

    2. Nyissa meg Component Services. Nyissa meg a Számítógépek mappát. Válassza Elosztott tranzakció koordinátorlehetőséget.

    3. Kattintson a jobb gombbal DTC-koordinátor, és válassza a Tulajdonságoklehetőséget.

    4. A Biztonsági lapon ellenőrizze Hálózati DTC-hozzáférés és Bejövőengedélyezése lehetőséget.

    5. Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.

    6. Kattintson OK gombra a párbeszédpanel bezárásához.

  3. Az ügyfélszámítógépen konfigurálja az MSDTC-t a kimenő hálózati tranzakciók engedélyezéséhez:

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

    2. Kattintson a jobb gombbal Saját számítógép elemre, és válassza a Tulajdonságoklehetőséget.

    3. Az MSDTC lapon kattintson Biztonsági konfigurációelemre.

    4. Ellenőrizze a hálózati DTC-hozzáférést és engedélyezze a kimenő-at.

    5. Kattintson OK, majd az Igen gombra az MSDTC szolgáltatás újraindításához.

    6. Kattintson OK gombra a párbeszédpanel bezárásához.