Tipy a triky s Caché / 26. tip: Objekty a concurrency 2 – swizzling

Keď sa ten­to se­riál pred nie­koľ­ký­mi rok­mi za­čí­nal, je­ho pr­vý di­el bol ve­no­va­ný za­bez­pe­če­niu izo­lá­cie in­štan­cie ob­jek­tov na exklu­zív­ny prís­tup a opi­su prís­luš­ných fun­kcií API. Ne­dáv­no sa mi však sta­lo, že ma ten­to di­el dos­ti­hol. Je­den zo zá­kaz­ní­kov za­čal mať prob­lé­my v ap­li­ká­cii, ho­ci dôs­led­ne pou­ží­val exklu­zív­ne zá­mky na edi­to­va­nie in­štan­cií svo­jich ob­jek­tov. Keď po prí­či­ne pát­ral dôs­led­nej­šie, zis­til (a priz­nám sa, že som to sám ne­ve­del), že zá­mky ap­li­ko­va­né na in­štan­cie ob­jek­tov ma­jú veľ­mi nep­rí­jem­nú vlas­tnosť, že sa ne­ší­ria pros­tred­níc­tvom od­ka­zov (swiz­zling) na ďal­šie pre­po­je­né ob­jek­ty.

A to bol prá­ve zdroj prob­lé­mov. V ap­li­ká­cii sa na­chá­dza­lo nie­koľ­ko miest, kde bo­la dvo­ma pro­ces­mi zá­ro­veň mo­di­fi­ko­va­ná rov­na­ká in­štan­cia ob­jek­tu. Raz pria­mo, dru­hýk­rát pros­tred­níc­tvom od­ka­zu prá­ve z inej, pri­po­je­nej trie­dy. Ako to­to mô­že nas­tať a ako ta­ké­to si­tuácie ošet­riť, to vám uká­že­me v nas­le­du­jú­com mo­de­lo­vom prík­la­de. Po stiah­nu­tí, roz­ba­le­ní a nain­šta­lo­va­ní pro­jek­tu mô­že­me tes­to­vať. Ot­vo­rí­me si dve kon­zo­ly Ca­ché a prep­ne­me sa do tes­to­va­cie­ho náz­vo­vé­ho pries­to­ru, prip­ra­ví­me si (ALE ZA­TIAĽ nes­pus­ti­te!) prí­ka­zy:

 // kon­zo­le 1
 >w ##class(User.Test).GoOb­jectB()
// kon­zo­le 2
 >w ##class(User.Test).GoOb­jec­tA(0)

Naj­skôr spus­tí­me pro­ces na kon­zo­le 1 a po­čas 10 se­kúnd aj pro­ces na kon­zo­le 2 a sle­du­je­me vý­stu­py. To, čo uvi­dí­me, mô­že vy­ze­rať na pr­vý poh­ľad čud­ne, ale je to v po­riad­ku, pro­ces v kon­zo­le 2 sa sna­ží ot­vo­riť no­vú in­štan­ciu ob­jek­tu User.B, a len čo sa mu to po­da­rí (po tom, čo pro­ces v kon­zo­le 1 uvoľ­ní zá­mok), na­čí­ta ho z DIS­KU a zme­ní. Me­dzi­tým pro­ces v kon­zo­le 2 vy­ko­ná opä­tov­né na­čí­ta­nie in­štan­cie z dis­ku a zob­ra­zí vý­sle­dok. V ideál­nom prí­pa­de bu­dú hod­no­ty oboch in­štan­cií kon­zis­ten­tné (v praxi sa nám to­tiž kód oboch kon­zol mô­že vy­ko­nať rôz­ne rých­lo a vrá­tiť po­tom to­mu zod­po­ve­da­jú­ce - od uve­de­né­ho ob­ráz­ka od­liš­né - vý­sled­ky).

A te­raz za­vo­lá­me

 // kon­zo­le 1
 >w ##class(User.Test).GoOb­jectB()
 // kon­zo­le 2
 >w ##class(User.Test).GoOb­jec­tA(1)

Vý­sle­dok bu­de od­liš­ný - rov­na­ká in­štan­cia ob­jek­tu vra­cia rôz­ne hod­no­ty v kaž­dom pro­ce­se, ako uka­zu­je súhrn­ný ob­rá­zok č. 1.

cache.jpg

Kri­tic­ký kód uvá­dzam eš­te se­pa­rát­ne: tak­to tre­ba vždy ošet­riť prís­tup k od­ka­zo­va­ným ob­jek­tom, ak ich chce­me izo­lo­vať.

 #dim oB as User.B
 w !,"Trying to Open B from A"
 set oB=oA.re­la­ceB.%Open(oA.re­la­ceB.%Oid(),4,.sc)
 $$$THROWONERROR(sc,sc)
 set oB.B2 = "B2 Do­ne"

Roz­die­ly v sprá­va­ní zá­mkov pri pria­mom prís­tu­pe a pri pou­ži­tí swiz­zlin­gu mô­žu, ako sme si uká­za­li, mať veľ­ké dôs­led­ky na ap­li­ká­ciu. Žiaľ, do­ku­men­tá­cia k to­mu­to sprá­va­niu nie je dos­ta­toč­ne pod­rob­ná.

Ten­to prík­lad sa vám mô­že zdať pri­tiah­nu­tý za vla­sy, ale v praxi mož­no na ta­kú kom­bi­ná­ciu dvoch pro­ce­sov pra­cu­jú­cich nad rov­na­kou in­štan­ciou raz pria­mo a raz ne­pria­mo ľah­ko na­ra­ziť. Ak nap­rí­klad vy­ko­ná­va­te úč­tov­ný zá­pis, ak­tua­li­zu­je­te zos­tat­ky na jed­not­li­vých úč­toch ana­ly­tic­kej evi­den­cie v úč­tov­nej kni­he, ale aj me­ní­te zos­tat­ky na prís­luš­ných úč­toch syn­te­tic­kej evi­den­cie. No a ak sa niek­to roz­hod­ne zme­niť čo­koľ­vek na syn­te­tic­kom úč­te v oka­mi­hu reali­zá­cie úč­tov­nej ope­rá­cie, je za­mie­se­né na neš­ťas­tie, prav­da, iba ak ne­bu­de­te dbať na uve­de­né od­po­rú­ča­nia.

_KI_8311 copy.jpg Dan Ku­táč, Inter­Sys­tems

Ďal­šie za­ují­ma­vé di­ely se­riá­lu Ti­py a tri­ky s Ca­ché, kto­ré vy­chá­dza­jú už od ro­ku 2005, ­náj­de­te na ­stiah­nu­tie tu: http://www.inter­sys­tems.cz/edu­ca­tion/uni­ver­si­ty/se­ria­ly/ti­py­Tri­ky­Ca­che.html

Zdroj: IW 12/2011



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Prog­ra­mu­je­me GPU / 8. časť
Tentoraz budeme pokračovať v opise základných konštrukcií jazyka GLSL. Budeme sa venovať štruktúram, poliam a tzv. kvalifikátorom, resp. špecifikátorom uloženia. čítať »
 
Ti­py a tri­ky s Ca­ché / 26. tip: Ob­jek­ty a con­curren­cy 2 – swiz­zling
Keď sa tento seriál pred niekoľkými rokmi začínal, jeho prvý diel bol venovaný zabezpečeniu izolácie inštancie objektov na exkluzívny prístup a opisu príslušných funkcií API. čítať »
 
Spring Fra­mework / 3. časť: IoC s po­mo­cou ano­tá­cií
V predošlej časti sme sa oboznámili s konceptom Inversion-of-Control, ktorý sa v Springu realizuje prostredníctvom Dependency Injection. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XLI.
V tejto časti seriálu opíšeme spôsob, ktorým sme do našej aplikácie Engine v3.1 implementovali jednoduché zvukové efekty. čítať »
 
Vý­voj ap­li­ká­cií pre iPad/iPod/iP­ho­ne: Návrh pou­ží­va­teľ­ské­ho roz­hra­nia / 2. časť
Plynule nadviažeme na predchádzajúcu časť, v ktorej sme opísali hardvérovú a softvérovú konfiguráciu potrebnú na vývoj aplikácií pre rodinu zariadení Apple iPad, iPhone a iPad touch s operačným systémom iOS. čítať »
 
Tvor­ba inter­ak­tív­ne­ho webu s jQuery: Ani­má­cie / 7. časť
V predchádzajúcej časti tohto seriálu sme ukázali, ako pracovať s jednoduchými efektmi v jQuery a oživiť pomocou nich vzhľad stránok. čítať »
 
Li­nux prak­tic­ky ako server / Tes­to­va­nie pro­to­ko­lu NTP
V predchádzajúcej časti sme vysvetlili algoritmus protokolu NTP, povedali sme si niečo o zdrojoch času na internete a nakoniec sme si nainštalovali a nakonfigurovali službu NTP. čítať »
 
Tvor­ba for­mu­lá­rov na prá­cu s údaj­mi v pros­tre­dí Mic­ro­soft Sha­re­Point 2010
Prostredie SharePoint 2010 poskytuje používateľom na správu údajov rozhranie údajového hárka alebo formulár z prostredia webového prehliadača. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter