Optimistické zamykání neboli optimistické řízení souběžnosti () je metoda řízení souběžnosti bez zamykání, která se používá v transakčních systémech, jako jsou např. relační databázové systémy nebo softwarové transakční paměti. OCC předpokládá, že často může být více provedeno transakcí současně, aniž by se vzájemně rušily. Transakce používají při svém provádění datové prostředky bez používání zámků, které by zajišťovaly výhradní přístup k těmto prostředkům. Aby nedošlo k porušení dat z důvodu souběhu, musí každá transakce před svým potvrzením ověřit, že dříve načtená data nebyla mezitím změněna jinými transakcemi. Pokud došlo ke konfliktním změnám, musí se transakce odvolat a je třeba ji zahájit znovu. Optimistické řízení souběžnosti poprvé navrhl Hsiang-Tsung Kung a John T. Robinson v roce 1979.

OCC se obecně používá v prostředích s nízkým soupeřením o data. Pokud konflikty nejsou časté, transakce se mohou dokončovat bez nákladů na správu zámků a bez čekání na uvolnění zámků jinými transakcemi, což vede k vyšší propustnosti než použití jiných metod řízení souběžnosti. Pokud je však soupeření o datové prostředky časté, náklady na opakované restartování transakcí výrazně snižují výkon, a v takovém případě mohou být vhodnější jiné metody řízení souběžnosti. Také metody založené na zámcích („pesimistické“) mohou snižovat výkon, protože i když se daří vyhýbat se zablokování, zamykání může drasticky omezovat efektivní souběžnost.

Fáze optimistického řízení souběžnosti Transakce s optimistickým řízením souběžnosti mají 4 fáze: (zahájení): Zaznamenání stavu na začátku transakce (např. časového razítka). (modifikace dat): Načtení hodnot z databáze a jejich modifikace mimo databázi. (ověření): Kontrola, zda data použitá touto transakcí nebyla změněna jinou transakcí; jiné transakce mohly být dokončeny po zahájení naší transakce nebo mohou být v době ověřování stále aktivní. (potvrzení nebo vrácení): Pokud nedošlo ke konfliktu, jsou změny zapsány. Pokud ke konfliktu došlo, je třeba jej vyřešit, typicky zrušením transakce (vycouváním z transakce), i když jsou možné i jiné způsoby řešení. Je třeba dávat pozor, aby nedošlo k chybě „time-of-check to time-of-use“, obzvláště pokud tato a předchozí fáze nebyly provedeny jako jediná atomická operace.

Použití na webu Bezstavová povaha protokolu HTTP neumožňuje zamykání při uživatelských modifikacích přes webové rozhraní. Často se stává, že uživatel začne upravovat záznam, a pak odejde bez provedení akce „cancel“ nebo „logout“. Pokud by se používaly zámky, ostatní uživatelé, kteří chtějí upravovat stejný záznam, by museli čekat, dokud nevyprší prodleva zámku prvního uživatele.

Hypertext Transfer Protocol poskytuje určitou formu OCC. Odezva na počáteční požadavek GET může obsahovat hodnotu ETag, kterou je třeba uvést v hlavičce If-Match následujících požadavků PUT. PUT požadavky s neaktuální hodnotou ETag v hlavičce If-Match server zamítne.

Některé systémy řízení databází poskytují OCC nativně, bez potřeby speciálního aplikačního kódu. U ostatních může aplikace implementovat OCC vrstvu mimo databázi, aby zabránila neomezenému čekání nebo přepisování záznamů bez varování. Webový formulář může pro tento účel používat skryté pole, které obsahuje původní hodnotu záznamu, časové razítko, pořadové číslo nebo token bez popsané struktury. Při odeslání modifikace se tato položka porovná s databází. Pokud se liší, je vyvolán algoritmus řešení konfliktů.

Příklady OCC se používá při úpravách stránek v MediaWiki.Nápověda:Editační konflikt Bugzilla používá OCC; editační konflikty se nazývají „mid-air kolize“. Framework Ruby on Rails má API pro OCC. Framework Grails používá OCC implicitně. Databázový stroj GT.M používá OCC pro řízení transakcí (i jednoduché aktualizace jsou považovány za minitransakce). Entity Framework společnosti Microsoft (včetně Code-First) má vestavěnou podporu pro OCC založenou na hodnotě binárního časového razítka. Většina verzovacích systémů používá pro souběžné změny model „merge“ (slučování), což je forma OCC. Mimer SQL je DBMS, který implementuje pouze optimistické řízení souběžnosti. Úložiště dat Google App Engine používá OCC. Vyhledávací stroj Apache Solr podporuje OCC pomocí pole _version_. Vyhledávací stroj Elasticsearch využívá OCC při aktualizaci dokumentů. Každé verzi dokumentu je přiřazeno pořadové číslo, a novější verze dostávají vyšší pořadová čísla. Protože změny dokumentu mohou přicházet asynchronně, software může používat pořadová čísla, aby se zabránilo přepsání novější verze starší verzí. CouchDB implementuje OCC pomocí revizí dokumentů. Schéma řízení transakcí systému řízení báze dat sloupcově orientované databáze MonetDB využívá OCC. Většina implementací softwarových transakčních pamětí používá OCC. Redis poskytuje OCC pomocí příkazu WATCH. Firebird používá Multiversion concurrency control jako implementaci OCC pro správu dat. DynamoDB používá podmíněné aktualizace jako implementaci OCC. Kubernetes používá OCC při aktualizaci prostředků. YugabyteDB je cloudová databáze, která primárně používá OCC. Firestore je NoSQL databáze společnosti Firebase, která při transakcích používá OCC. Apache Iceberg používá OCC při aktualizaci tabulek a při údržbě.

Odkazy

Reference

Externí odkazy

Kategorie:Řízení souběžnosti Kategorie:Algoritmy řízení souběžnosti Kategorie:Transakční zpracování