Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Optimistická souběžnost odvodí jeho název z optimistického předpokladu, že ke kolizím mezi transakcemi dojde zřídka; Kolize se říká, že došlo k tomu, když jiná transakce aktualizuje nebo odstraní řádek dat mezi časem, kdy je přečteno aktuální transakcí a čas, kdy je aktualizován nebo odstraněn. Je to opak pesimistické souběžnosti nebo uzamčení, ve kterém vývojář aplikace věří, že takové kolize jsou běžné.
Při optimistické kontrole souběžnosti zůstává řádek odemčen přesně do chvíle, kdy má dojít k jeho aktualizaci nebo odstranění. V tomto okamžiku se řádek znovu načte a zkontroluje, jestli se od posledního čtení změnil. Pokud se řádek změnil, aktualizace nebo odstranění se nezdaří a musí se zkusit znovu.
Chcete-li zjistit, zda byl řádek změněn, je jeho nová verze zkontrolována na verzi řádku uloženou v mezipaměti. Tato kontrola může být založená na verzi řádku, například na sloupci časového razítka v SQL Serveru nebo na hodnotách jednotlivých sloupců v řádku. Mnoho dbMS nepodporuje verze řádků.
Optimistickou souběžnost může implementovat zdroj dat nebo aplikace. V obou případech by aplikace měla používat nízkou úroveň izolace transakcí, jako je Potvrzené čtení. Použití vyšší úrovně neguje zvýšenou souběžnost získanou pomocí optimistické souběžnosti.
Pokud zdroj dat implementuje optimistickou souběžnost, nastaví aplikace atribut příkazu SQL_ATTR_CONCURRENCY na SQL_CONCUR_ROWVER nebo SQL_CONCUR_VALUES. Pokud chcete řádek aktualizovat nebo odstranit, spustí umístěný příkaz update nebo delete nebo volá SQLSetPos, podobně jako by to bylo u pesimistické souběžnosti; ovladač nebo zdroj dat vrátí chybu SQLSTATE 01001 (konflikt operace kurzoru), pokud aktualizace nebo odstranění selžou kvůli kolizi.
Pokud samotná aplikace implementuje optimistickou souběžnost, nastaví atribut příkazu SQL_ATTR_CONCURRENCY na SQL_CONCUR_READ_ONLY pro čtení řádku. Pokud má porovnat verze řádků a nezná sloupec verze řádku, volá SQLSpecialColumns s možností SQL_ROWVER, aby určil název tohoto sloupce.
Aplikace aktualizuje nebo odstraní řádek zvýšením souběžnosti na SQL_CONCUR_LOCK (pro získání přístupu k zápisu do řádku) a spuštěním příkazu UPDATE nebo DELETE s klauzulí WHERE , která určuje verzi nebo hodnoty, které řádek měl při čtení aplikace. Pokud se od té doby řádek změnil, příkaz nebude úspěšný. Pokud klauzule WHERE neidentifikuje řádek jedinečně, příkaz může také aktualizovat nebo odstranit jiné řádky; verze řádků vždy jednoznačně identifikují řádky, ale hodnoty řádků jednoznačně identifikují pouze řádky, pokud obsahují primární klíč.