You are on page 1of 18

www.enaxos.

com

Formations .NET C# Delphi.NET / Win32 Audit Dveloppement

Copyright2006OlivierDAHAN Reproduction,utilisationetdiffusioninterditessans lautorisationdelauteur.Pourplusdinformation contacterodahan@enaxos.com

Lesnouvelles transactionsdistribues de.NET2.0


Page1sur18

www.enaxos.com Abstract Lestransactionsdistribuessontunajoutessentielduframework .NET2.0.Ellespeuventtreutilisespourvaliderdestransactions rparties sur plusieurs serveurs la fois. Leur force est dtre orientes Objet et donc de pouvoir sappliquer toute sorte de ressources, bases de donnes, objets, queue de messages (MMQ parexemple),etc. En simplifiant la programmation des transactions tout en offrant un champ dapplication plus vaste que les transactions purement orientes donnes des bases SQL, les nouvelles transactions distribuesoffrentcohrenceetconsistanceauxapplications.Elles sappliquent aux dveloppements simples comme aux dveloppements sophistiqus et concernent donc tous les dveloppeurs. Sommaire Prsentation ................................................................................................... 3 Lanotiondetransaction ............................................................................ 3 AudeldesSGBD....................................................................................... 3 System.Transactions....................................................................................... 4 Lestransactionssous.NET1.1 ....................................................................... 4 Leslimitationsdumodleclassique........................................................... 5 LesDTCetlesEnterpriseServices.............................................................. 7 LeslimitationsdesEnterpriseServices ...................................................... 8 Lestransactionssous.NET2.0 ....................................................................... 9 LTM&OTM ................................................................................................ 9 Uncassimple............................................................................................ 10 Lescasmoinssimples............................................................................... 10 Commentutiliserlestransactionsde.NET2.0 ............................................ 11 TransactionScope ..................................................................................... 11 Deadlock.............................................................................................. 12 Rglagedutimeout .............................................................................. 12 Validation ............................................................................................. 12 Mortdunetransaction ........................................................................ 13 Exceptions ............................................................................................ 13 Leniveaudisolation................................................................................. 14 Lestransactionsimbriques..................................................................... 15 Conclusion .................................................................................................... 17 Liens.............................................................................................................. 18

Page2sur18

www.enaxos.com

Prsentation
La notion de transaction La gestion des transactions est au cur du processus de dveloppement lun des aspects les plus importants. Par transaction il faut entendre un ensemble doprations bornes et identifies au sein dun groupe (la transaction)garantissantquecetensembleestvalidourejetentotalit. Lapplicationlapluscourantedececonceptseretrouvedanslesbasesde donnes relationnelles qui intgrent ce concept au niveau mme du serveur. Oracle, Interbase, SQL Server et dautres proposent la notion de transaction. La transaction ne garantit pas seulement lannulation ("Rollback") ou la validation ("Commit") de la totalit des oprations quelle encadre, elle assure aussi la cohrence des lectures des informations fixant ainsi un champdevisibilitbiendterminlapplicationouvrantunetransaction. Interbase ou SQL server 2005 proposent par exemple la notion de transaction "snapshot" (clich) que dautres serveurs noffrent pas et qui permet de voir la base exactement telle quelle tait louverture de la transactionquelsquesoientlesactionsdesautresutilisateurs.Onretrouve aussidesconceptsplusfrquenttelquele"readcommitted"assurantque durant la transaction seuls les informations valides dans les autres transactionsserontvisiblesoubienle"dirtyread"permettantdaccder toutenouvelleinformationmmenonvalide. Certainesbasesvontplusloinenoffrantlanotiondetransactiondite"two phasecommit"(validationendeuxtemps)autorisantdtendrelecontexte dunemmetransactiondesoprationsralisessurplusieursbasesde donnes diffrentes (gnralement limit des bases de mme type du mmediteur). Tout cela est trs utile et trs puissant, mme si on peut constater que beaucoup de dveloppeurs ngligent cet aspect dans leurs ralisations (expriencefaitedelauteurquipratiquedesauditspourauprsdeclients trsdivers). Au-del des SGBD Depuisdenombreusesannesledveloppementprofessionnelsestdirig vers la POO. Ds lors les donnes ne sont plus manipules uniquement selon le mode client / serveur, il suffit de voir comment sous .NET par exemple les ObjectDataSource, limplmentation de DAL Objet (Data AccessLayer)etdautrestechniquesmodifientradicalementlapprochede lagestiondesdonnes.Riennachangdanslesprit,ilsagitjustedlargir lanotiondedonnestouteressourcepouvantseprsentersousla forme dun accs effectif une base de donnes autant qu la modification des proprits dun objet ou dune grappe dobjets en

Page3sur18

www.enaxos.com mmoire, voire sous la forme de dialogues entre plusieurs serveurs et clientsdansunearchitecturemultitiers. Oncomprendbienquedslorslagestiondestransactionsofferteparles serveursdebasesdedonnes,mmeenmodetwophasecommit,nest plus suffisante ni adapte toutes ces oprations qui ont lieu, le plus souvent,endehorsdetouteliaisonunserveurSQL. Ainsiontrouvenaturellementdessolutionsnouvellescebesoinnouveau. Microsoft propose depuis longtemps dj MTS (Microsoft Transaction Server) et les Enterprise Services. Sous Java on trouve les JTA/JTS (Java Transaction API/Java Transaction Service) qui offrent des possibilits de mmetype. Il tait donc tout aussi naturel que .NET apporte sa pierre ldifice en offrant son lot de nouveauts touten rendantla gestion des transactions distribuesplussimplesprogrammer.

System.Transactions
Descendons sans transition de ces concepts thrs aux mains dans le cambouis Avec lespace de noms System.Transactions, .NET 2.0 apporte une rponseauxbesoinslespluslargesdetransaction.Plusencore,lesservices icipropossformentlesocledunegestiontransactionnelleintgralement manage. Avec cette nouvelle couche transactionnelle, Microsoft ne nous propose passeulementunegestiondistribuerserveauxdveloppementsmulti serveurs puisque les transactions purement locales sont aussi prises en compte.Cettenouvelleapprocheintressedonctouslesdveloppeurs,de petitesoudegrandesapplications,localesoudistribues.

Lestransactionssous.NET1.1
Avant dentrer dans le vif du sujet rappelons comment fonctionnaient les transactionssous.NET1.1. La premire des choses noter est que ce systme transactionnel ne sappliquait quaux donnes et faisait donc partie intgrante du bloc ADO.NETalorsquelesnouvellestransactionsnesontpasliescedernier.

Page4sur18

www.enaxos.com
string connectionString = ""; SqlConnection conn = new SqlConnection(connectionString); conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; SqlTransaction transaction; transaction = connection.BeginTransaction(); // dbut cmd.Transaction = transaction; try { /* travail sur les donnes */ transaction.Commit(); // validation } catch { transaction.Rollback(); // annulation } finally { connection.Close(); } Code1Gestiontransactionnellesous.NET1.1avecADO.NET

Le code 1 1 cidessus montre le mcanisme de gestion des transactions applicable sous .NET 1.1 avec ADO.NET. Lexemple utilise les classes spcialisespourSQLServeur. La squence comprend: lobtention dun objet transaction qui marque le dbutdecelleci,letravailsurlesdonnes,lavalidationdelatransaction. Lagestiondesexceptionspermetdegrerlannulationdelatransactionen casdeproblme. Tout ceci est purement orient donnes SQL et dpend du support transactionnelduserveurconsidr. Les limitations du modle classique Comme point plus haut, la premire limitation de ce modle transactionnelestquilestintimementliauconceptdebasededonnes cequiinterditsonutilisationdansdautrescontextes,notammentpourdes objetsenmmoire. Lautre point le plus gnant, et mme en restant dans le domaine des SGBD,concernelastructuredelatransaction.Danslemodleclassiquevu plus haut (code 1), nous pouvons identifier facilement lobjet qui est responsabledudbutetdelavalidationdelatransactionquineporte,de plus,quesuruneseuleressourceexterne(uneseulebasededonnes).
LesexemplesiciproposssonttousenC#.Ntantquedessquelettesdecodeinvoquant desclassesduframeworkilssontfacilementtransposablessousdautreslangages.
1

Page5sur18

www.enaxos.com Maisquecepassetilsiplusieursobjetsparticipentenmmoirelamise jourdesdonnesdanslabase?

ObjetA ObjetB

ObjetC

SGBDR

Figure1AccsmultiobjetuneressourceSGBDR

Lafigure1montreuncaspluscomplexeolamodificationetlaccsaux donnes sont raliss par plusieurs instances dobjet diffrents (A, B et C surledessin). Dans un tel contexte, lequel de ces objets sera responsable de lappel BeginTransaction? Lequel aura pour responsabilit de valider ou dannulercettemmetransaction?

Page6sur18

www.enaxos.com

ObjetA ObjetB ObjetC

BdD1

BdD2

BdD3

Figure2Uncasencorepluscomplexe

La figure 2 nous montre un cas encore plus complexe o de nombreux objetsinteragissentavecdenombreuxserveursdedonnes. On comprend bien quarriv un tel niveau de sophistication, rpondant pourtant des besoins bien rels, les solutions classiques deviennent totalementinoprantes. Les DTC et les Enterprise Services Pour lever les limitations du modle classique, Windows met la dispositiondudveloppeurunservicesystmeappelDTCpourDistributed TransactionCoordinator(coordinateurdetransactiondistribue). Sonavantageestdeporterleconceptdetransactionunniveaupluslev engrantlestransactionsautraversdescomposants,desprocessusetdes machines.DTCutiliseleprotocoleOleTx(OLETransactions). SilesttoutfaitpossibledatteindreetdeprogrammerDTCdirectement, sous.NETlafaonlaplusdirecterestelutilisationdesservicesdelespace denomsSystem.EnterpriseServices.

Page7sur18

www.enaxos.com
using System.EnterpriseServices; [Transaction] public class MonComposant : ServicedComponent { [AutoComplete] public void MaMthode() { /* interaction avec les ressources protges par la transaction */ } } Code2UtilisationdesEnterpriseServicessous.NET

Comme le montre le code 2, les Enterprise Services fonctionnent sur un modle de programmation dclaratif. La classe protger par une transaction descend de ServicedComponent et utilise lattribut Transactionquigarantitquedsquunemthodeseraappele,ellesera excutedanslecontextedunetransaction.Laseulechosequelobjetdoit faire cest de prvenir DTC, par le biais de la classe ContextUtil, que la transactiondoittrevalideouannule. Plus simple encore, une mthode marque par lattribut AutoComplete effectuera ce travail automatiquement: en cas de succs et en fin de mthode la transaction sera valide, en cas derreur dexcution (exception)latransactionseraannule. Les limitations des Enterprise Services Commeonpeutleconstater,lesEnterpriseServicesoffrentunconfortet unesimplicitdeprogrammationtoutfaitapprciables,surtoutlorsquon pense la complexit des tches effectues automatiquement pour maintenirlecontextetransactionnelentretouteslesressourcespossibles. Nanmoinsilfautadmettrequecemodlenestpassansimperfectionsou plutt lourdeurs. Par exemple le fait dobliger lhritage depuis ServicedComponentestassezpeupratique,cethritageprendlaplacede celuiquelapplicationestendroitdutiliseretfausseainsisamodlisation objet.IldevientalorsimpossibledesupporterlesEnterprisesServicesdans unearborescencedeclassesmtierssanscontorsionsstylistiquesnuisibles. Dautrepart,lutilisationdesEnterpriseServicesimpliquelutilisationsous jacente de transactions DTC et cela mme si un seul objet et une seule ressourcesontimpliqusdanscellesci.Lutilisationsystmatiquedutwo phasecommitimposesoncotetgrignoteinutilementlesperformances delapplicationetdesserveurs. Audeldecesinconvnients,lesEnterpriseServicesreposentsurCOM+et sestraversquenombrededveloppeurscherchentfuirOnpourraaussi

Page8sur18

www.enaxos.com noterquelesstratgiesdegestiondesE.S.nesontpassansposerdesouci dslorsquonnopreplussurdesobjetsactivslademandemaisavec despoolsdobjets.Enfin,ajoutonsquelesE.S.sontthreadsafeetquecela implique que plusieurs threads ne peuvent particips la mme transaction.Ilsagitleplussouventdunegarantiedebonfonctionnement et dune simplification du code, mais cela peut savrer tre une svre limitationdanscertainscontextes.

Lestransactionssous.NET2.0
Devant la situation dpeinte plus haut il fallait trouver une solution si ce nest plus lgante (DTC et les Enterprises Services forment une solution quilestpluttassez),aumoinsplussoupleetnesouffrantpasdesdfauts quenousavonslists. Pour ce faire Microsoft a introduit deux nouveaux gestionnaires de transactionainsiquunespacedenomddileurgestion. LesnouveauxgestionnairessontleLTM(LightweightTransactionManager, gestionnairelgerdetransaction)etOTM(OleTxTransactionManager). LTM & OTM LTM a t conu pour grer les transactions lintrieur dun seul App Domain 2 etnutilisantquuneseuleressource. OTM soccupe lui de grer les transactions stendant sur plusieurs App Domains,voiresurplusieursprocessusoumachines.Ilestaussiactivdans le cadre de transactions vivant dans un seul App Domain mais invoquant plusieursressources. Techniquement OTM utilise RPC (Remote Procedure Call, appel de procdure distante) pour les appels inter machines et se comporte finalementdefaonassezprochedeDTCdontnousavonsparlplushaut. Lavantage de cette sparation entre LTM et OTM est que lorsque les transactionssontsimples(unAppDomainetuneressource)latotalitdela gestion rside dans lApp Domain considr ce qui est beaucoup plus rapidequelesinvocationsRPC.Orilsetrouvequelestransactionslesplus courantes sont de ce type du coup la nouvelle gestion de .NET 2.0 acclre la majorit des applications par lutilisation de LTM, sans pour autant prsenter de limite lorsquil sagit de traverser les processus et les machinespuisquelcestOTMquiestutilis. Soccuperdetoutcelapourraitrendreledveloppementpluscomplexe.Il nen est rien puisque une couche de haut niveau a t implmente par Microsoft,cestjustementSystem.Transactions. Une des particularits de cette nouvelle gestion transactionnelle est appele la promotion de transaction. Dans le cas le plus simple (un App
2

espacedexcutionduneapplication.NET.

Page9sur18

www.enaxos.com Domain,uneressource)cestunetransactiondetypeLTMquiserautilise, mais si une ressource supplmentaire est utilise, si un objet distant est invoqu,alorslatransactionserapromueentypeOTM,automatiquement. Par dfaut, ce qui est modifiable par code, toute nouvelle transaction est ainsi de type LTM. Elle ne se voit promue en OTM que si le contexte limpose. Au final cest donc une gestion simplifie et unifie, majoritairement automatiquequiestpropose,cequirendledveloppementplusais. Un cas simple Pour de nombreux dveloppeurs les transactions utilises par leur code sontpresqueuniquementdestransactionssimples:ellesviventauseinde lApp Domain de leur application et ne font quinvoquer une ressource unique,parexempleunebasededonnesOracleouSQLServer. Dans un tel cas cest une transaction LTM qui sera alloue par .NET et commelaressourceutiliseestcapabledegrerellemmelatransaction, cellecrepar.NETseborneramonitorerletravaileffectuparlabase dedonnes. Dansuntelcasdefigure,utiliserlestransactionsde.NETaulieudecellede la base de donnes peut sembler superflu. Ce nest pas totalement faux, maiscommecettenouvellegestiondetransactionnalourditpasletravail effectuerparlamachineouparleserveurdedonnes,autantlutilisercar elle garantit une grande cohrence au code (transaction SGBD ou transaction objet, plus aucune diffrence), permet de rsoudre certains problmes(voirlafigure1),etrendtouteamliorationducodesimple(par exemple utiliser deux bases de donnes dans la transaction sans pour autantavoirenmodifierletypeetlagestion). Les cas moins simples Ilyadeuxvnementsquidclenchentlapromotiondunetransactionde typeLTMenOTM:louvertureduneconnexionautrebasededonnes ou autre ressource dite durable, et la transmission audel des limites delAppDomaindelatransactionsrialise. Par exemple en cas de remoting il suffit dajouter un paramtre de type Transaction la procdure distante auquel on passera latransaction en cours (Transaction.Current() qui retourne null si aucune transaction nestengage). Dautresmcanismesoumoyendclaratifspermettentdecontrlerletype de transaction (LTM ou OTM) et mme dans les cas les plus ardus le nouveausystmedetransactionsavretoutaussipuissantquesimple. Il y aurait encore beaucoup dire sur la faon exacte dont tout cela fonctionne. Mais nous risquerions de lasser ceux dentre vous plus intresssparlapratiquequeparlesconsidrationstechniques.Pourceux

Page10sur18

www.enaxos.com quecelapassionnetouslesdtailssurlagestioninternedestransactionsse trouventsurlessitesdeMicrosoftetdanscertainsarticlessurleweb.

Commentutiliserlestransactionsde.NET2.0
Il est temps dexplorer concrtement comment utiliser cette nouvelle gestiondetransaction. Avant toute chose, rappelons que lespace de noms utiliser est System.Transactions. Pour y avoir accs dans un assemblage il suffit dajouterauprojetlarfrencelaDLL.NETdemmenom. Lemodledclaratifdeprogrammationdestransactionsnechangepaset nousnelaborderonspasici,ilsuffitdutiliserlesEnterpriseServices,avec les avantages et dfauts dont nous avons parl en introduction. Comme ADO.NET a t modifi dans .NET 2.0 pour tirer profit des nouvelles transactionsilnyarienchangerparrapportducode.NET1.1.LesLTM seront utilises chaque fois que cela est possible ce qui induira de meilleuresperformances.Cemodedclaratifnestpasforcmentceluique ledveloppeurdevraaujourdhuichoisir. TransactionScope Microsoft appelle modle explicite de programmation des transactions le fait dutiliser volontairement dans le code les possibilits de lespace de nomsSystem.Transactions. Lemoyenleplussimpledetirerprofitdesnouveauxmcanismespassepar la classe TransactionScope, qui, comme son nom lindique, permet de crerunespacetransactionnelpourunesectiondecode. Lorsquune instance est cre une transaction est ouverte (en mode LTM par dfaut)et cette instanceest place dans lechamp declasse Current de la classe Transaction ce qui permet de pouvoir sy rfrer tout momentetdepuisunpointdaccsunique. Comme TransactionScope est une classe qui supporte IDisposable, la transaction se terminera lorsque la mthode Dispose() sera appele explicitementoubienimplicitementparlebiaisdumotclusing.
Using (TransactionScope scope = new TransactionScope()) { /* Manipulation de la ressource durable ici */ scope.Complete(); // aucune erreur, validation } Code3TransactionScope

Le code 3 cidessus montre la faon la plus simple dutiliser les nouvelles transactions. La ressource durable sera le plus souvent une base de donnes dans les applications de gestion. Mais si le code utilise deux

Page11sur18

www.enaxos.com connexionsdemain,ilmarcheraquandmmeenmodetransactionnelpar lamagiedelapromotionautomatiquedelatransactionLTMenOTM.

Dead-lock
Silecodedelatransactionprendtropdetempspoursexcutercelapeut signifierquilexisteundeadlock,ouverroumortelenfranais.Pournepas se laisser piger par une telle situation la transaction sera automatiquementannulepassuncertaintemps.Celapsdetempsddi latransactionestuntimeoutparamtrablequiestfix60secondespar dfaut.Onpeutmodifiercetempsparprogrammationoupardclaration dansunfichierdeconfiguration.

Rglage du timeout
Le timeout peut tre spcifi lors de la cration de linstance de TransactionScope:
TimeSpan timeout = TimeSpan.FromSeconds(25); using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, timeout)) {...} Code4Rglerletimeout

Un timeout de zro dfinit un timeout infini. Cela nest rserver quen modededbogagelorsquilfautpouvoirinspecterlecodeavecdespoints darrtsansqueletimeoutpardfautnesenclencheenraisondespauses effectuesdansletraitement. On peut aussi tre amen poser un timeout trs court, de lordre de quelquesmillisecondes,pourforcerlatransactionchouercequiesttrs pratiqueendbogagepourvrifiercommentlecodegrelesexceptionsen casdchec. Si une transaction imbrique rejoint lAT 3 (voir plus bas) en fixant une valeurdetimeoutinfrieurecelledelATcestcettevaleurquidevientle timeoutdelAT.Silavaleurestplusgrande,celanapasdeffetsurlAT. La modification de la valeur du timeout peut avoir dautres motivations (commeviterdesdeadlocks)maisilfautsavoirquecelanedoitpastre faitlalgreenraisondesimplicationspartoujoursvidentescernerau premiercoupdil

Validation
Lobjettransactionnaenluimmeaucunmoyendesavoirsilatransaction doit tre annule ou valide. Dans certains cas comme le timeout lannulationestchoisieautomatiquementmaiscelaresteuncasparticulier.
3

AmbientTransaction,transactioncourantedanslaporte.

Page12sur18

www.enaxos.com Pour marquer le succs dune transaction lobjet TransactionScope possde un champ boolen nomm consistency qui est false linitialisation de la transaction. Lorsquil passe true la transaction est valide (Commit). Plutt que de manipuler consistency il est conseill, comme dans le code exemple 3 plus haut dappeler la mthode Complete(). Bien entendu cet appel est unique sur une transaction donne. Lappeler unesecondefoislverauneexceptionInvalidOperation.

Mort dune transaction


LorsquunobjetTransactionScopenestpasutilisdansunblocusingetsi rien nest fait volontairement lobjet va un moment donn sortir de la porteetdoncdevenirligiblesadestructionparleramassemiettes.Si GCquifinaliselobjetoubiensiletimeoutintervientavant,latransaction sera tue. Ltat des donnes protges par la transaction ce moment dpendra du champ boolen consistency. Sil est false, la transaction sera annule, sil avait t plac true, notamment par un appel Complete(),latransactionseravalide. Il est bien entendu dconseill de programmer les transactions de cette manire.

Exceptions
Le fait dappeler Complete() pour valider une transaction ne garantit en rien que cette validation va seffectuer correctement. Les ressources engagesdanslatransactionpeuventrefuserlavalidationpourdestasde raisons. Sil sagit dune base de donnes, le Commit qui sera envoy au serveur peut chouer car les donnes insres, modifies ou dtruites violentdescontraintesparexemple. Dans un tel cas lobjet transaction lvera une exception de type TransactionAbortedException. Une programmation correcte des transactions se doit de dtecter ce cas et den avertir lutilisateur ou de prendredesdcisionsvisantcorrigerlasituation. Lecodeexemple5cidessousmontrecommentutiliserlesexceptionsdans unegestiondetransaction:

Page13sur18

www.enaxos.com
try { using(TransactionScope scope = new TransactionScope()) { /* manipulation des ressources durables */ scope.Complete(); // validation } } catch(TransactionAbortedException e) { MessageBox.Show(e.Message); } catch //autres exceptions { Trace.WriteLine("La transaction a t annule."); throw; } Code5Gestiondesexceptionsdansunetransaction

Le niveau disolation Le niveau disolation dune transaction conditionne la visibilit des informationsvalidesetnonvalidesdanslesautrestransactionsencours. Certains constructeurs de TransactionScope acceptent un paramtre permettant de fixer ce niveau disolation qui peut prendre les valeurs suivantes:
public enum IsolationLevel { ReadUncommitted, ReadCommitted, RepeatableRead, Serializable, Unspecified, Chaos, Snapshot } Code6Niveauxd'isolationd'unetransaction

Les niveaux dfinis par .NET sont ici ceux quon a lhabitude de retrouver dans les bases de donnes. Leur signification est la mme (mme si les transactions .NET ici discutes peuvent concernes des ressources autres quelesbasesdedonnes). Le niveau Chaos dfinit un mode spcial dans lequel aucune isolation nexiste(dosonnom). LeniveauSnapShotestnotammentimplmentparSQLServer2005.

Page14sur18

www.enaxos.com Lutilisation dun mode autre que Serializable implique une excellente matrise des concepts transactionnels ainsi que du fonctionnement des ressourcesdurablesinvoques.Ilfautaussinoterquetouslesgestionnaires deressourcesnimplmententpasforcmenttouslesniveauxproposspar .NET, un autre niveau est alors substitu ce qui peut entraner une inconsistanceauxconsquencesimprvisibles. Les transactions imbriques Il est tout fait possible dimbriquer des transactions. Cela se fait le plus simplementcommelecodeexemple7cidessouslemontre:
using(TransactionScope scope1 = new TransactionScope()) { /* code */ using(TransactionScope scope2 = new TransactionScope()) { /* code */ scope2.Complete(); } /* code */ scope1.Complete(); } Code7Transactionsimbriques

Ce type dimbrication est dit direct car limbrication est implmente volontairementdansunemmesectiondecode. Il existe aussi des imbrications dites indirectes. Cela arrive lorsquune mthode qui a ouvert une transaction en appelle une autre qui fait de mme.Lecodeexemple8cidessousmontreuntelcas:

Page15sur18

www.enaxos.com
void Methode_A() { using(TransactionScope scope = new TransactionScope()) { /* manipulation des ressources durables ici */ Methode_B(); // imbrication de Trans. indirecte. scope.Complete(); } } void Methode_B() { using(TransactionScope scope = new TransactionScope()) { /* manipulation des ressources durables ici */ scope.Complete(); } } Code8Imbricationindirectesdetransactions

Il peut exister autant de niveaux dimbrication que ncessaire, directs et indirects.Latransactionlaplusexterneestappelelaracine. Lorsque des transactions sont imbriques il se pose immdiatement la question de savoir comment le devenir de chacune des transactions internes va influer sur celui de la transaction racine. Comme cela peut dpendre du contexte, lobjet TransactionScope fournit plusieurs versions de son constructeur qui acceptent un paramtre de type TransactionScopeOption qui est une numration dfinissant les choix suivants: Leffetdechaqueoptiondpenddelventuelletransactionencours.Pour mieuxcomprendrenousavonsregroupcidessouslescombinaisonsdans untableau.Cequiestappelambienttransaction(noteATplusloin)estla transactionventuellementencoursquiexisteounonlorsquelacration dun nouvel objet TransactionScope intervient. Le paramtre (son effet) sappliquecenouvelobjetTransactionScope.
Required RequiresNew Suppress

Page16sur18

www.enaxos.com Option Ambienttransaction(AT) Existe Nexistepas Crationdune transaction. Devientlaracine danssaporte.

Required

RejointAT

RequiresNew

Crationdunenouvelletransaction. Devientlaracinedanssaporte. Neparticiperajamaisunetransactionen cours. LATdanssaporteseratoujoursnull.

Suppress

Tableau1Lesdiffrentescombinaisonsdesoptionsd'unetransaction

Lorsquunetransactionrejointunetransactionencours,ellenemetpasfin lATlaquelleelleparticipelorsque Dispose()estrencontre.Cestla transactionracinededcider. Lors de la cration dun objet TransactionScope, et si loption nest pas prcisedansleconstructeur,cestlavaleur Requiredquiestutilisepar dfaut. Les autres options prennent leur intrt dans des cas particuliers. Par exemple loption Suppress est adapte des sections de code qui ne doivent pas faire chouer lventuelle transaction de plus haut niveau si jamaiselleschouentellesmmes.Ilpeuttreparfoisintressantdecrer unesectionnontransactionnelleauseindunetransactionetcestdansce casprcisquonutiliseraSuppress. Lorsquonutiliselemode RequiresNewilestimportantdeveillerceque les deux transactions, lAT et celle nouvellement cre, ne soient pas en interaction menant une inconsistance des donnes protges si lune choueetquelautreestvalide. Pour terminer notons que lappel Complete() dans une transaction imbrique, et mme si celleci rejoint lAT, ne modifie pas ltat du boolen consistancy de lAT ellemme. De fait il convient de valider chaquetransactionquellequesoitlimbrication.

Conclusion
La nouvelle gestion de transaction propose par .NET 2.0 est un grand progrs. Plus simple programmer que les anciennes techniques, plus

Page17sur18

www.enaxos.com automatis,plusconomeenressource,lenouveaumodleestpratiqueet puissant. Ilexistebiendautresaspectsnontraitsicicommelagestionmanuelledes transactions impliquant CommittableTransaction, ou bien les vnementsdeTransactionScope,ouencorelagestiondelascuritdes transactions distribues devant se protger contre des attaques de type denyofserviceetbiendautreschosesencore.Chacundesessujetspour passionnantquilsoitnousasemblunpeutroppointupourenjustifierla prsentation dans cet article qui se veut seulement tre une dcouverte dunenouveautde.NET2.0. Silesujetvousaccroche,nhsitezpasconsulterlessitesdeMicrosoftet lesarticlesquontrouvesurleWeb,etsurtout:nhsitezpaspublierle rsultat de vos tests personnels. Cest par le partage de la connaissance quenousvoluonstous. Enmatiredetechniqueilyalesmystificateursquitententdefairecroire quils savent tout par leurs recherches personnelles, et il y a les autres, lucidesetpasmoinsmritants,aucontraire,quilavouenthumblementsi jesaisquelquechose,cestquequelquunlacrit. Ecrivonsetpartageonsnossavoirs,nousavonstousygagner!

Liens
Vouspouvezapprofondirvotrecomprhensiondesnouvellestransactions de.NET2.0enlisantlinformationproposeauxliensquisuivent.Ilssont donnstitreindicatifuniquementetnengagepaslauteurdeceslignes. Les liens sont rputs valides au jour et lheure o ces lignes ont t crites. IntroducingSystem.TransactionsintheMicrosoft.NETFrameworkversion 2.0 nexiste pas en franais lheure actuelle. La trame a t partiellementutilisepourconstruirelarticleiciprsent. http://www.microsoft.com/downloads/details.aspx?familyid=AAC3D722 444C4E278B2EC6157ED16B15&displaylang=en System.Transactions,espacedenomsMicrosoft,lienfranais. http://msdn2.microsoft.com/frfr/library/system.transactions.aspx MercredidudveloppementSystem.Transactions7juin2006Slide deMicrosoftFranceassezcomplet. http://download.microsoft.com/download/f/6/b/f6bf1900db6f4478 b45156f091e678b1/Presentation.ppt

Page18sur18

You might also like