it-swarm-eu.dev

Proč je optimistické zamykání rychlejší než pesimistické zamykání?

Obě formy zamykání způsobí, že proces čeká na správnou kopii záznamu, pokud je aktuálně používán jiným procesem. Při pesimistickém zamykání mechanismus zámku pochází ze samotné databáze DB (nativní objekt zámku), zatímco u optimistického zamykání je mechanismus zámku nějaká forma verzování řádků jako časové razítko, aby se zkontrolovalo, zda je záznam „zastaralý“ nebo ne.

Oba však způsobují zablokování druhého procesu. Tak se ptám: Proč je optimistické zamykání obecně považováno za rychlejší/lepší než pesimistické zamykání? A existují případy použití, kdy je pesimistický přednost před optimismem? Díky předem!

9
Mara

Duplicitní otázka od:

https://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-locking

Kopírovat/vložit odpověď z výše uvedeného odkazu:

Optimistické zamykání je strategie, při které čtete záznam, berete na vědomí číslo verze a před zápisem záznamu si ověřte, že se verze nezměnila. Když zapíšete záznam zpět, filtrujete aktualizaci na verzi, abyste se ujistili, že je atomová. (tj. mezi kontrolou verze a zápisem na disk nebyl aktualizován) a aktualizací verze jedním zásahem.

Pokud je záznam špinavý (tj. Jiná verze než vaše), transakci zrušíte a uživatel ji může znovu spustit.

Tato strategie je nejvhodnější pro velkoobjemové systémy a třívrstvé architektury, kde pro svou relaci nutně neudržujete připojení k databázi. V této situaci klient nemůže ve skutečnosti udržovat zámky databáze, protože připojení jsou převzata z fondu a možná nebudete používat stejné připojení z jednoho přístupu na další.

Pesimistické zamykání je, když uzamknete záznam pro své výhradní použití, dokud s ním neskončíte. Má mnohem lepší integritu než optimistické zamykání, ale vyžaduje, abyste byli opatrní při návrhu aplikace, abyste se vyhnuli zablokování. Chcete-li použít pesimistické zamykání, potřebujete buď přímé připojení k databázi (jak tomu obvykle bývá v aplikaci dvouvrstvého klientského serveru), nebo externě dostupné ID transakce, které lze použít nezávisle na připojení.

V druhém případě otevřete transakci pomocí TxID a poté se znovu připojte pomocí tohoto ID. DBMS udržuje zámky a umožňuje vybrat relaci zpět prostřednictvím TxID. Takto fungují distribuované transakce používající dvoufázové potvrzovací protokoly (například transakce XA nebo COM +).

Upravit (Přidání dalších informací k vyřešení otázky týkající se výkonu):

Výkon je závislý na vašem prostředí. Rozhodněte se v následujících faktorech:

zjistíte, že optimismus bude lepší díky souběžnosti ve většině situací. V závislosti na RDBMS a prostředí to však může být méně nebo více výkonné. Obvykle s optimistickým zamykáním zjistíte, že hodnota musí být někde řádková verze.

Například s MS SQL Serverem bude přesunut do TempDB a na konec sloupce bude připojeno něco mezi 12-14 bajty. Zapnutí optimistického zamykání s úrovní izolace, jako je izolace snímku, může způsobit fragmentaci a váš faktor výplně bude muset být upraven, protože řádky nyní mají na konci další údaje, které by mohly způsobit, že stránka je téměř plná, což způsobí rozdělení stránky, což se sníží váš výkon. Pokud je váš TempDB pod optimalizací, nebude to tak rychlé.

Takže myslím, že kontrolní seznam je:

  • -Máte dostatečné IO/zdroje pro zpracování verze verzí řádků? Pokud ne, přidáváte režii. Pokud ano, pak pokud čtete data často, když je často blokujete pro zápisy, všimnete si dobrého zlepšení souběžnosti napříč čtení a zápisů (ačkoli zápisy budou stále blokovat zápisy, čtení již nebudou blokovat zápisy a naopak)
  • -Je váš kód náchylný k zablokování nebo máte zamykání? Pokud nezažíváte dlouhé zámky nebo mnoho zablokování, pak další režie optimistického zamykání by věci nezrychlila, samozřejmě, ve většině případů tu mluvíme milisekundy.
  • - Pokud je vaše databáze velká (nebo na velmi omezeném hardwaru) a vaše datové stránky jsou téměř plné, v závislosti na RDBMS byste mohli způsobit velké rozdělení stránek a fragmentaci dat, proto nezapomeňte po zapnutí znovu zvážit reindexování.

To jsou mé myšlenky v této záležitosti, otevřené slyšení více od komunity.

8
Ali Razeghi

Chápete optimistické zamykání.

Optimistické zamykání nezpůsobuje, že transakce čekají na sebe.

Optimistické zamykání pravděpodobně způsobí selhání transakce, ale činí tak, aniž by bylo kdykoli provedeno „uzamčení“. A pokud transakce selže z důvodu optimistického zamykání, je uživatel povinen začít znovu. Slovo „optimistický“ je odvozeno od přesně očekávání, že podmínka, která způsobí selhání transakcí právě z tohoto důvodu, nastane jen velmi výjimečně. „Optimistické“ zamykání je přístup, který říká: „Nebudu brát skutečné zámky, protože doufám, že stejně nebudou potřeba. Pokud se ukáže, že jsem se v tom mýlil, přijmu nevyhnutelné selhání.“.

11
Erwin Smout

Optimistické zamykání je obecně rychlejší, protože ve skutečnosti neexistuje žádné zamykání z pohledu databáze. Je zcela na aplikaci, zda bude respektovat sloupec verze (nebo pseudo-sloupec, jako je ora_rowscn) nebo ne. Normálně máte mnoho aplikací připojených ke stejné databázi, takže db se stane sdíleným prostředkem a pokud se zablokuje, budou ovlivněni všichni klienti.

S optimistickou strategií zamykání dochází k „zavěšení“ na straně klienta a neovlivňuje ostatní.

Pokud je však záznam často aktualizován, můžete jej znovu načíst příliš mnohokrát (v případě optimistického zamykání), a tak porazit co nejvíce výhod optimistické strategie.

Nesouhlasil bych s nadřazeností obou přístupů; oba mohou být zneužity. Pesimistický je náchylnější k chybám pouze proto, že je mnohem nebezpečnější: k zamykání dochází na úrovni db, záleží na tom, že RDMS nemusíte mít kontrolu nad tím, co je zamčeno (eskalace zámku), musíte se o uzamykací příkaz starat ručně.

1
a1ex07

Optimistické zamykání předpokládá, že souběžné transakce mohou být dokončeny, aniž by se vzájemně ovlivňovaly. Optimistické zamykání je tedy rychlejší, protože při provádění transakcí nejsou vynucovány žádné zámky. Je to prevence způsobující souběžné problémy, které se nevyléčí. Transakce pouze ověří (tři způsoby datových sad, typ dat časového razítka, zkontrolovat starou a novou hodnotu) data, která žádná jiná transakce data neupravila. V případě modifikace je transakce vrácena zpět.

Pesimistické zamykání předpokládá, že souběžné transakce budou spolu navzájem v konfliktu, takže vyžaduje uzamčení, provádí se zadáním úrovně ISOLATION (Read Uncommitted, Read Committed, Repeatable Čtěte a Serializable) řízení transakcí. Léčí problémy souběžnosti získáním zámku. zámky slouží k ochraně sdílených zdrojů nebo objektů (tabulky, datové řádky, datové bloky, položky s mezipamětí, připojení a celé systémy). Máme mnoho typů zámků jako sdílené zámky, aktualizační zámek, vložený zámek, exkluzivní zámky, transakční zámky, zámky DML, zámky schémat a zámky pro obnovení zálohování.

získat další představ

0
Premraj