Оптимистична контрола поклапања

С Википедије, слободне енциклопедије

Оптимистична контрола поклапања (ОКП) је метода контроле поклапања које се примењују у трансакцијским системима као што је систем за управљање релационим базама података.

ОКП претпоставља да више трансакција често могу да се заврше без ометања међусобно. Док раде, трансакције користе податке без стицања закључавања над тим податцима.

Пре него што започне рад, свака трансакција проверава да ниједна друга трансакција није мењала податак који је читала. Ако провера открије одређене измене, тренутна трансакција се враћа уназад и може бити поново покренута.[1] ОКП је први пут предложио Х. Т. Кунг.[2]

ОКП се обично користи у окружењима са малим протоком података. Када су сукоби ретки, трансакције могу да се извршавају без трошка о закључавању и без тога да једна трансакција чека крај закључавања друге трансакције, то јасно доводи до већег протока у односу на друге методе котроле поклапања. Међутим ако је аргумент за ресурсе чест, цена поновног покретања трансакције шкоди учинку знатно, општа је мисао да друге методе контроле поклапања имају бољи учинак под овим условима. Методе базиране на закључавању ("песимистичне") такође могу да имају лош учинак зато што закључавање може драстично да ограничи ефикасно поклапање чак и кад се трајна закључавања избегну.

ОКП фазе[уреди | уреди извор]

ОКП трансакције укључују следеће фазе:

  • Почетак: Снима временски маркер који обележава почетак трансакције.
  • Измена: Чита вредности из базе података и провизорно пише промене.
  • Потврда: Проверава да ли су друге трансакције мењале податке које је тренутна трансакција користила (читала или писала). Ово укључује и трансакције које су се завршиле након почетка тренутне трансакције и опционо, трансакције које су активне још од потврде.
  • Извршити/Повратак: Ако не долази до сукоба, све промене ће бити извршене. Ако долази до сукоба углавном се решава прекидањем трансакције иако постоје друга решења. Водите рачуна како би сте избегли ТОСТТОУ грешку, посебно ако ова фаза и претходна фаза нису изведене из једне атомичке операције.

Веб употреба[уреди | уреди извор]

Природа HTTP-а чини закључавање непрактичним за веб кориснички интерфејс.

Уобичајено је за корисника да крене да исправља запис и онда да га остави без "поништити" или "одјава" линка (везе). Ако је закључавање коришћено, други корисници који покушају да мењају исти снимак морају да сачекају док се првом кориснику закључавање не паузира.

HTTP пружа уграђену форму ОКП-а. Метода GET враћа ETag за ресурсе тако да следећи PUT захтев користи ETag вредност у "If-Match" пољу заглавља. Док први PUT захтев успева, други захтев неће моћи зато што је вредност у "If-Match" пољу базирана на првој верзији ресурса.[3]

Неки системи за управљање базама података пружају ОКП изворно - без потребе посебног апликационог кода. За друге, апликација може провести ОКП слој изван базе да би се избегло чекање или немо преписивање записа.

У таквим случајевима формулар садржи скривено поље са оригиналном верзијом записа, временским маркером, редним бројем или токеном. Кад се пошаље, запис се упоређује са записом из базе података и ако се разликују позива се алгоритам за решавање сукоба.

Примери[уреди | уреди извор]

  • Медијавикијине странице за уређивање користе ОКП[4]
  • Redis омогућава ОКП кроз WATCH команду[5]
  • Гуглов програм за продавницу користи ОКП[6]
  • Ruby on Rails оквир има АПИ за ОКП[7]

Референце[уреди | уреди извор]

  1. ^ Johnson, Rohit (2003). „Common Data Access Issues”. Expert One-on-One J2EE Design and Development. Wrox Press. ISBN 978-0-7645-4385-2. Архивирано из оригинала 08. 10. 2011. г. Приступљено 10. 06. 2016. 
  2. ^ Kung, H.T. (1981). „On Optimistic Methods for Concurrency Control”. ACM Transactions on Database Systems. 
  3. ^ „Editing the Web - Detecting the Lost Update Problem Using Unreserved Checkout”. W3C Note. 10. 5. 1999. 
  4. ^ Help:Edit conflict
  5. ^ „Transactions in Redis”. 
  6. ^ „The Datastore”. What Is Google App Engine?. 27. 8. 2010. 
  7. ^ „Module ActiveRecord::Locking”. Rails Framework Documentation. 

Литература[уреди | уреди извор]