660 likes | 794 Views
Tran zakciók kezelése a WCF-ben. Bevezetés. A tranzakció egy olyan logikai egység, amely több elemi lépést úgy fog össze, hogy azok vagy mind sikeresen lezajlanak, vagy mind elbuknak. Pl.: banki átutalás két lépése: pénz leemelése a forrásszámláról pénz jóváírása a célszámlára
E N D
Bevezetés • A tranzakció egy olyan logikai egység, amely több elemi lépést úgy fog össze, hogy azok vagy mind sikeresen lezajlanak, vagy mind elbuknak. • Pl.: banki átutalás két lépése: • pénz leemelése a forrásszámláról • pénz jóváírása a célszámlára • Ha nem egyszerre sikeresek, valaki rosszul jár.
Bevezetés • Ha a tranzakcióban szereplő összes utasítás sikeresen lezajlik → commit • Ha legalább az egyik nem sikeres → rollback • Rollback esetén a már lezajlott műveletek inverz párját kell elvégezni, hogy minden a kezdeti állapotba állhasson vissza
Bevezetés • Ilyen logikát megvalósító algoritmus (bármilyen problémára) hagyományos módon is készíthető • Azonban a programozók megsegítésére ez az eszköz be van építve a WCF keretrendszerbe
Áttekintés • Az alábbi tulajdonságokkal rendelkeznek: • Atomiság • Konzisztencia őrzés • Izoláció • Tartósság
Áttekintésatomiság • Az atomiság arra vonatkozik, hogy a műveletcsoportot kell egy bonthatatlan egységnek tekinteni. • A szabály szerint vagy minden részművelet sikeresen lezajlik és a hatásuk végleges, vagy mindegyikük elbukik és a rollback végrehajtódik.
Áttekintéskonzisztencia őrzés • Ez a feltétel garantálja, hogy a tranzakció lezajlása után konzisztens állapotból konzisztens állapotba kerüljön a rendszer. • Ha pl. egy bank egyik számlájáról egy másikra emelünk át pénzt, akkor az átutalás után a banknak ugyanannyi pénze kell, hogy maradjon.
Áttekintésizoláció • Megakadályozza, hogy egy félkész (komittálatlan) tranzakció által ideiglenesen létrehozott inkonzisztens állapotot egy másik tranzakció megfigyelhesse. • Továbbá meggátolja, hogy két folyamatban lévő tranzakció egymásra hatást gyakoroljon.
Áttekintéstartósság • Egy kommittált tranzakció hatása: • vissza nem vonható • esetleges meghibásodásoktól a lehetőségekhez mérten védett
Áttekintés • A WCF támogatja a WS-Atomic Transaction (WS-AT) protokollt, amely lehetővé teszi a tranzakciók áramoltatását együttműködő programok között • Létezik támogatás az OLE Transactions protokollhoz is (az OLE Transactions a Microsoft interface szabványa a tranzakciók kezeléséhez.)
Áttekintés • Konfigurációs fájlban állítható be, hogy: • igényeljük-e tranzakciókat, • milyen típusút használnánk, • külön-külön time-out értékeket állíthatunk be minden szolgáltatási szinthez
Áttekintés • A tranzakciók attribútumai a System. ServiceModel névtérben a következő lehetőségeket nyújtja: • time-out-ok és izolációs szintek beállítása a ServiceBehaviorAttribute attribútummal, • tranzakciók funkcionalitásának és viselkedésének beállítása a OperationBehaviorAttribute attribútummal, • a ServiceContractAttribute és az OperationContract-Attribute segítségével a Contract-ot megvalósító metódusban igényelhetjük; engedélyezhetjük; vagy megtagadhatjuk a tranzakciók áramoltatását
Tranzakció-modellek • Három fajta modell: • Windows Communication Foundation Transactions (WCFT) • System.Transactions Transactions (STT) • MSDTC Transactions (MSDTC)
Tranzakció-modellekWCFT • Tranzakcióval támogatott szolgáltatások írását teszi lehetővé • WS-AtomicTransaction (WS-AT) támogatás • Egy program, amely WCFT-t használ, kommunikálhat másik WCF szolgáltatással, vagy akár third-party technológiákkal
Tranzakció-modellekWCFT • Egy WCF szolgáltatást megvalósító programban a WCFT segítségével definiálható, hogy pontosan hogyan, és mikor jöjjön létre a tranzakció-struktúra, továbbá képes azokat végrehajtani illetve szinkronizálni
Tranzakció-modellekSTT • A System.Transactions névtér két modellt ötvöz: • egy explicit programmodellt a Transaction osztály támogatásával, illetve • implicit lehetőségeket nyújt a TransactionScope osztály, amellyel az elkészített struktúrát könnyen tranzakcióként lehet kezelni
Tranzakció-modellekSTT • A System.Transactions egy WCF szolgáltatásban olyan programmodell létrehozását támogatja, mellyel egy tranzakciót a kliensben hozhatjuk létre • Ez a tranzakció külön kérés nélkül, explicit módon intézhet kéréseket a szolgáltatást megvalósító programtól (ha szükséges)
Tranzakció-modellekMSDTC • Az MSDTC egy tranzakció manager, amely elosztott tranzakciók kezeléséhez nyújt segítséget. • Támogatást ad mind a szolgáltató, mind a kliens oldalán a létrehozott tranzakciók kezeléséhez.
Tranzakció attribútumok • Három standard System.ServiceModel attribútum a tranzakciók konfigurálására: • TransactionFlowAttribute • ServiceBehaviorAttribute • OperationBehaviorAttribute
TransactionFlowAttribute • Egy eljárás klienstől érkező, bejövő tranzakció-fogadási hajlandóságát definiálja • Az attribútum a kontrollt a TransactionFlowOption tulajdonság értékének beállításával valósítja meg. A felvehető értékek: Mandatory, Allowed, vagy NotAllowed
TransactionFlowAttribute • Ez az egyetlen attribútum ami a kiszolgálói műveleteket hozzárendeli a külső klienssel történő érintkezésekhez. • A következő részben ismertetett tulajdonságok a művelet végrehajtása közbeni tranzakciók alkalmazásához kapcsolódnak.
ServiceBehaviorAttribute • Definiálja a külső futtatás viselkedését a service contract-ben • Az alábbi speciális paraméterei vannak: • TransactionAutoCompleteOnSessionClose • ReleaseServiceInstanceOnTransactionComplete • TransactionIsolationLevel • TransactionTimeout
ServiceBehaviorAttributeTransactionAutoCompleteOnSessionCloseServiceBehaviorAttributeTransactionAutoCompleteOnSessionClose • Automatikusan befejez egy befejezetlen tranzakciót, ha be van állítva • Default: false • Ha true-ra állítjuk és bármilyen okból a kapcsolat a tranzakció commitálódása előtt megszakad, akkor a tranzakciót megpróbálja teljesíteni. • Ha false, akkor hiba esetén (a logikusabb) rollback-et hajtja végre • Csak akkor lehet true, ha a kapcsolat session-orientált
ServiceBehaviorAttributeReleaseDerviceInstanceOnTransactionCompleteServiceBehaviorAttributeReleaseDerviceInstanceOnTransactionComplete • Meghatározza, hogy elengedje-e az erőforrásokat, ha a tranzakció befejeződött • Default: true • Egy új bejövő kérés egy új mögöttes példányt hozat létre, függetlenül attól, hogy az előző tranzakció fenntartott-e erőforrást, vagy sem • A szolgáltató-példány felszabadítása a szerver belső művelete, és nem érint semmilyen egyéb példányt sem, amit a kliens hozatott létre
ServiceBehaviorAttributeTransactionIsolationLevel • (ahogy sejthető) az izoláció szintjét határozza meg a szolgáltatónál • Az attribútum értékének az IsolationLevel osztály statikus változói közül kell választani • Ha a helyi izolációs szint különbözik az Unspecified-től, akkor minden bejövő tranzakció izolációs szintje meg kell, hogy egyezzen a helyileg beállított értékkel.
ServiceBehaviorAttributeTransactionIsolationLevel • Ha ez nem teljesül, akkor a bejövő tranzakció elutasításra kerül, majd a sikertelenségről a kliens is értesül. • Ha a TransactionScopeRequired igaz és nincs tranzakció folyamatban, akkor ez a tulajdonság határozza meg az izolációs szintet, amit a helyileg létrehozott tranzakciókban kell használni.
ServiceBehaviorAttributeTransactionIsolationLevel • Ha az izolációs szint Unspecified-re van állítva, akkor a Serializable kerül használatra
ServiceBehaviorAttributeTransactionTimeout • Az a lejárati idő adható meg vele, hogy az új tranzakcióknak mennyi idejük van a commit-álásra • Ha egy félkész tranzakció esetében lejár az időkorlát, akkor automatikusan abortálódik • Az időkorlát értéke nem haladhatja meg azt az időt, mely a tranzakicó létrehozásától, annak végrehajtásáig terjed (1 lefutás esetén) egy kétfázisos nyugtázási protokoll esetén
ServiceBehaviorAttributeTransactionTimeout • Az időkorlát értéke mindig a • TransactionTimeout és a • transactionTimeout • beállítások közül a kisebb lesz.
OperationBehaviorAttribute • Egy metódus viselkedését határozza meg a szolgáltatói oldalon • A műveletek végrehajtásának viselkedését lehet jelezni vele • Értékének beállítása nincs hatással a Web Service Description Language (WSDL) service contract leírására • fontos, gyakran használatos feature-ket valósít meg
OperationBehaviorAttributeTransactionScopeRequired • Meghatározza, hogy egy metódus egy aktív tranzakció hatókörébe esik-e • Default: false • Ha az OperationBehaviorAttribute nincs beállítva egy metódushoz, akkor ez azt is jelenti, hogy ez a metódus nem tartozik tranzakcióhoz
OperationBehaviorAttributeTransactionScopeRequired • Ha egy tranzakció hatáskör követel egy műveletet (végrehajtás szempontjából), akkor a tranzakció forrása a következő négy valamelyike lesz: 1.: Ha a tranzakció a klienstől indul, az eljárás a tranzakció hatáskörén belül jön létre, elosztott tranzakciók felhasználásával 2.: Egy sorszámozott átvitelnél a tranzakció visszafejti az üzenetsort. (Fontos, hogy ebben az esetben a tranzakció nem adatáramként továbbítódik)
OperationBehaviorAttributeTransactionScopeRequired 3.: Egyéni továbbítási mód céljából a TransportTransactionProperty értékét kell állítani 4.: Ha az első 3 nem teljesül, akkor egy új Transaction példány jön létre a hívó metódus függvényében
OperationBehaviorAttributeTransactionAutoComplete • Meghatározza, hogy az ügylet, amelyben a metódus fut, automatikusan befejeződik, ha nem dobódnak lekezeletlen kivételek • Ha true, és nem keletkezett kivétel, akkor a hívó eljárás automatikusan sikeresnek jelöli meg a tranzakciót • Ha false, akkor a tranzakció a példányhoz csatolódik és csak akkor jelöli meg sikeresként, egy additívan meghívott metódus beszámol a tranzakció szolgáltató oldali sikeres lefutásáról, vagy ha ez a metódus explicite hívja meg a SetTransactionComplete eljárást.
OperationBehaviorAttributeTransactionAutoComplete • Ha bármelyik előbbi eljárás elbukik: • a tranzakció sohasem lesz sikeresként megjelölve, • a benne foglalt lépések kommittálatlanok maradnak, hacsak a TransactionAutoCompleteOnSessionClose attribútum nem lett megelőzőleg igazra állítva (ha igazra lett állítva az InstanceContextMode a PerSession értéket kell, hogy felvegye)
ServiceModel Transaction Configuration • Három attribútum a tranzakciók szolgáltatássá való konfigurálására: • transactionFlow, • transactionProtocol, és • transactionTimeout.
transactionFlow beállítása • A legtöbb előre definiált WCF kötés (binding) tartalmazza a transactionFlow és transactionProtocol attribútumokat • A kötés beállítható úgy, hogy a bejövő tranzakciókat egy bizonyos endponint számára a meghatározott transactionFlow protokoll alapján kezelje • A fenti két elemmel egyedi kötések készíthetőek
transactionFlow beállítása • A transactionFlow attribútum definiálja, hogy egy tranzakció egy szolgáltatás végponton keresztül annak kötését használva adatfolyamként működjön-e
transactionProtocol beállítása • Definiálja a tranzakció protokollt, hogy hogyan használja a szolgáltató endpoint-jait (amik pedig a kötéseket használják) • A következő konfigurációs rész egy meghatározott kötéshez kapcsol egy adatfolyam típusú tranzakciót és a WS-AtomicTransaction protocoll használatát
transactionProtocol beállítása <netNamedPipeBinding> <binding name="test" closeTimeout="00:00:10" openTimeout="00:00:20" receiveTimeout="00:00:30" sendTimeout="00:00:40" transactionFlow="true" transactionProtocol="WSAtomicTransactionOctober2004" hostNameComparisonMode="WeakWildcard" maxBufferSize="1001" maxConnections="123" maxReceivedMessageSize="1000"> </binding> </netNamedPipeBinding>
transactionTimeout beállítása <configuration> <system.serviceModel> <behaviors> <behavior name="NewBehavior" transactionTimeout="00:01:00" /> <!-- 1 minute timeout --> </behaviors> </system.serviceModel> </configuration>
transactionTimeout beállítása • A transactionTimeout határozza meg azt az időperiódust, amely alatt a tranzakciónak le kell zajlania • A rá vonatkozó kritériumokat már láttuk... • Értékében a legkisebb az összes time-out típusú tulajdonság közül
ADATFOLYAMOK • A WCF nagyon rugalmas beállítási lehetőségeket kínál a tranzakció adatfolyammá történő beállítására • A konfigurálás itt is attribútumokon keresztül történik
Adatfolyam beállítások • A tranzakció beállítások az alábbi három érték együttesével: • A TransactionFlowAttribute meghatározott minden metódus számára a service contract-ban • A TransactionFlow binding tulajdonság a meghatározott kötésben • A TransactionFlowProtocol engedélyezi, hogy két különböző tranzakció protokoll közül válasszunk, amelyet az adatáram a tranzakcióhoz használ. A következőkben ezekről lesz szó.
Adatfolyam beállításokWS-AtomicTransaction protokoll • Olyan scenairo-k számára hasznos, amikor egy műveletek közötti protokoll-stack használata elkerülhetetlen (műveletek közötti: saját protokoll egy third-party protokollal való kommunikációja)
Adatfolyam beállításokOleTransaction protokoll • Olyan scenairo-k számára hasznos, amikor a WS-AT-nél jellemző protokoll-stack nem szükséges, és a szolgáltatás fejlesztője tudja, hogy a WS-AT szolgáltatás helyileg tiltott, vagy • egy létező hálózati topológia nem képes támogatni a WS-AT-t.
Adatfolyam beállítások • Amíg minden metódus a szerződésben kaphat különböző tranzakció folyam követelményeket, a tranzakció folyam protokoll beállítása a binding szintjére terjed ki. • Ez azt jelenti, hogy minden metódus, amit ugyanazon a végponton osztozik (amiből az is következik, hogy ugyanazon a binding-on), szintén osztozik ugyanazon a politikán, amely engedélyezi, vagy igényli az adatfolyamot (ugyanúgy, mint a közös tranzakció protokollt).