Tranzakció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 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és atomisá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és konzisztencia ő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és izolá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és tartó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:System. ServiceModel –time-out-ok és izolációs szintek beállítása a ServiceBehaviorAttribute attribútummal, ServiceBehaviorAttribute –tranzakciók funkcionalitásának és viselkedésének beállítása a OperationBehaviorAttribute attribútummal,OperationBehaviorAttribute –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átServiceContractAttributeOperationContract- Attribute
Tranzakció-modellek Három fajta modell: –Windows Communication Foundation Transactions (WCFT) –System.Transactions Transactions (STT) –MSDTC Transactions (MSDTC)
Tranzakció-modellek WCFT 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ó-modellek WCFT 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ó-modellek STT A System.Transactions névtér két modellt ötvöz:System.Transactions –egy explicit programmodellt a Transaction osztály támogatásával, illetveTransaction –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 TransactionScope
Tranzakció-modellek STT A System.Transactions egy WCF szolgáltatásban olyan programmodell létrehozását támogatja, mellyel egy tranzakciót a kliensben hozhatjuk létreSystem.Transactions 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ó-modellek MSDTC 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:System.ServiceModel –TransactionFlowAttributeTransactionFlowAttribute –ServiceBehaviorAttributeServiceBehaviorAttribute –OperationBehaviorAttributeOperationBehaviorAttribute
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 TransactionFlowOption
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: –TransactionAutoCompleteOnSessionCloseTransactionAutoCompleteOnSessionClose –ReleaseServiceInstanceOnTransactionCompleteReleaseServiceInstanceOnTransactionComplete –TransactionIsolationLevelTransactionIsolationLevel –TransactionTimeoutTransactionTimeout
ServiceBehaviorAttribute TransactionAutoCompleteOnSessionClose 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
ServiceBehaviorAttribute ReleaseDerviceInstanceOnTransactionComplete 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
ServiceBehaviorAttribute TransactionIsolationLevel (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álasztaniIsolationLevel 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.
ServiceBehaviorAttribute TransactionIsolationLevel 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.TransactionScopeRequired
ServiceBehaviorAttribute TransactionIsolationLevel Ha az izolációs szint Unspecified-re van állítva, akkor a Serializable kerül használatra
ServiceBehaviorAttribute TransactionTimeout 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
ServiceBehaviorAttribute TransactionTimeout 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
OperationBehaviorAttribute TransactionScopeRequired 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
OperationBehaviorAttribute TransactionScopeRequired 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)
OperationBehaviorAttribute TransactionScopeRequired 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 Transaction
OperationBehaviorAttribute TransactionAutoComplete 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.SetTransactionComplete
OperationBehaviorAttribute TransactionAutoComplete 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 <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">
transactionTimeout beállítása
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ások WS-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ások OleTransaction 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 WS-AT vs. OleT TransactionFlow binding TransactionFlow binding property TransactionFlowProtocoll binding protocol Type of transaction flow MandatorytrueWS-ATA tranzakció csak együttműködő (interoperable) WS-AT formátumban folyhat MandatorytrueOleTA tr. csak a WCF OleT formátumban folyhat MandatoryfalseNem alkalmazhatóNem alkalmazható, mert ez egy helytelen konfiguráció AllowedtrueWS-ATA tr. valószínűleg WS- AT formátumban folyik
Adatfolyam beállítások WS-AT vs. OleT TransactionFlow binding TransactionFlow binding property TransactionFlowProtocoll binding protocol Type of transaction flow AllowedtrueOleTA tr. valószínűleg WCF OleT formátumú AllowedfalseBármilyen értékA tr. nem áramolhat NotAllowedBármilyen érték A tr. nem áramolhat
Adatfolyam beállítások üzenet feldolgozási eredmények Bejövő üzenetTransactionFlow setting Transaction headerMessage provessing result A tr. egyezik az elvárt protokoll- formával Allowed vagy Mandatory MustUnderstand == trueFeldolgozás A tr. nem egyezik meg MandatoryMustUnderstand == falseElutasítva, mert szükség van egy tr.-ra A tr. nem egyezik meg AllowedMustUnderstand == falseElutasítva, mert a header nem érthető A tr. bármilyen pr. formátumot használ NotAllowedMustUnderstand == falseElutasítva, mert a header nem érthető Nincs tr.Mandatory-Elutasítva, mert tr. kell Nincs tr.Allowed-Feldolgozás Nincs tr.NotAllowed-Feldolgozás
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).
Adatfolyam engedélyezése metódus szinten Az adatfolyam előkövetelményei nem mindig egyeznek meg az összes metódus számára a service contract-ban Minden metódushoz saját folyamszabály- zás készíthető Ez a TransactionFlowAttribute által érhető el, mely definiál egy szintet, amelyben egy szolgáltató művelet egy tranzakció header-t fogad
Adatfolyam engedélyezése metódus szinten A fejlesztőnek meg kell jelölnie a szolgáltatásának a contract-ot megvalósító metódusát ezzel az attribútummal, ha engedélyezni szeretné a tr. adatáramlását Ez az attribútum a TransactionFlowOption nevű enumerációs struktúrából választhat magának értéket Default: NotAllowed
Adatfolyam engedélyezése metódus szinten Ha nem NotAllowed az értéke, akkor az adott metódus nem lehet egyirányú A fejlesztő ezt az attribútumot használhatja a metódus-szintű adatfolyam előkövetelményeinek vagy korlátozásainak meghatározására
Adatfolyam engedélyezése endpoint szinten A metódus-szintű adatfolyam beállítási lehetőséget kibővítve a TransactionFlow- Attribute és a WCF lehetőséget ad egy végpontokra definiálható konfigurációt, hogy az adminisztrátorok magasabb szinten tudják kezelni a tranzakciókat. Ezt a TransactionFlowBindingElemet teszi lehetővé, mellyel engedélyezni, vagy letiltani lehet a bejövő adatfolyamot egy endpoint binding beállításában
Adatfolyam engedélyezése endpoint szinten Ha a kötés tiltja az adatfolyamokat, de az egyik művelet a service contract-ban egy bejövő tranzakciót igényel, akkor egy kivétel dobódik még a szolgáltatás indításakor A legtöbb WCF által biztosított hagyományos kötés tartalmazza a transactionFlow és transactionProtocol attraibútumokat, amelyek lehetővé teszik a kötés beállítását a bejövő tranzakciók fogadására Egy admin, vagy egy fejlesztő tehát arra használhatja a tranzakciós adatfolyamokat, hogy beállítsa az adatáram előkövetelményeit, vagy korlátait a fejlesztéskor - a konfigurációs fájl használva
Biztonság A tranzakciók adatfolyamában az üzenetek kódoltságáról gondoskodni kell A tranzakciókban folyó adatokat, vagy annak részleteit olyan kívülálló entitásnak nem szabad látnia Ha egy WCF kliens ismeretlen, vagy megbízhatatlan web-szolgáltatáson ke-resztül küld adatokat, a hívó műveleteknek ezen a web- szolgáltatáson - ha lehetséges - el kell nyomniuk az aktuális tranzakciót. A következő példa azt mutatja be, hogy hogyan kell ezt megtenni:
Biztonság //client code which has an ambient transaction using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) { // No transaction will flow to this operation untrustedProxy.Operation1(...); scope.Complete(); } //remainder of client code
Biztonság Továbbá a szolgáltatókat úgy kell konfigurálni, hogy csak olyan bejövő tranzakciókat fogadjanak el a kliensektől, amelyek authentikáltak és authorizáltak. Egy bejövő tranzakciót csak akkor szabad elfogadni, ha az egy teljesen megbízható klienstől érkezett
Policy követelmények A WCF ilyeneket használ az adatfolyam- szabályzásra Megtalálhatóak a szolgáltató policy dokumentációjában, ami a contract-ok, konfigurációk és attribútumok összességé-ből generálódik. Ezt a kliens HTTP-n keresztül GET-tel, vagy WS-MetadataExchange kérés-válasz segítségével kérheti le A kliens feldolgozhatja ezt policy dokumentumot, hogy eldönthesse, milyen műveleteket támogat a szolgáltató, és azoknak milyen követelményeik vannak
Policy követelmények Az adatfolyamok Policy követelményei hatással vannak magára az adatfolyamra, azáltal, hogy specifikálják a SOAP header-eket, melyeket a kliens elküldhet a szolgál-tatónak egy tranzakció reprezentációja-ként Minden tranzakció header-je meg kell hogy legyen jelölve a MustUnderstand tulajdonsággal, mely true-ra van állítva Ha ez nem teljesül, akkor SOAP hibával elutasításra kerül
Policy követelmények Egyszerre csak egy tranzakciófüggő policy lehet jelen egy szimpla műveletben Azok a policy dokumentumok, melyekben több, mint egy tranzakció assertion (követelés) szerepel egy művelethez, helytelenek és a WCF elutasítja azokat Továbbá csak egy szimpla tranzakció szerepelhet egy port-típuson belül
WS-AtomicTransaction Ez egy együttműködő tranzakció-protokoll Lehetőséget nyújt elosztott tranzakciók Web- szolgáltatásonok keresztüli üzenet- továbbítására Együttműködő módon koordinálja a hete-rogén infrastruktúrával rendelkező tranzakciókat Kétfázisú commit-protokollt használ, amely automatikus választ készít elosztott alkalmazások, tranzakció managerek és resource managerek között
WS-AtomicTransaction A WS-AT WCF-beli implementációja magába foglal egy ú.n. MSDTC (Microsoft Distributed Transaction Coordinator) nevű tranzakció manager-be épített protokoll szolgáltatást A WS-AT használatával a WCF alkalma-zások képesek tranzakciókat áramoltatni más alkalmazásoknak, beleértve az együttműködő web-szolgáltatásokat, melyek harmadik fél által készített technológiákra támaszkodnak
WS-AtomicTransaction Amikor egy tranzakció egy kliens és egy szerver között áramlik, a használt tranzakció protokoll meg van határozva azon binding által, amit a szerver tár fel a kliens által kiválasztott endpointon Néhány WCF rendszer által biztosított kötés alapból az OleTransactions protokollt használják a tranzakció terjesztéséhez, míg másoknál ugyanott a WS-AT a default. Az adott kötésben adott tranzakció protokoll választása a programban módosítható
WS-AtomicTransaction A protokollválasztások hatásai: –Az üzenet header-jének a formátumát arra használják, hogy áramoltassák a tranzakciót a klienstől a szerver felé –A hálózati protokollt arra használják, hogy kétfázisú commit-protokollt futtassanak a kliens tranzakció managere és a szerver tranzakciói között (mindezt azért, hogy meghatározzák a tranzakció eredményét)
WS-AtomicTransaction Ha a szerver és a kliens is WCF-et használ, akkor nincs szükség a WS-AT-re Helyette használható a NetTcpBinding default beállítása a TransactionFlow attribútum engedélyezésével, amely így inkább az OleTransactions protokollt fogja használni. Ha mégis web-szolgáltatásokon keresztül áramoltat az alkalmazás, akkor muszáj WS-AT-t használni.