sql >> Databáze >  >> RDS >> Oracle

Zpracování souběžných aktualizací v režimu spánku

Může mi někdo vysvětlit, jestli pro správu transakcí používáme pružinu, jak bude souběžné aktualizace zpracovávat hibernace (automatická správa verzí v paměti pro hibernaci) nebo musím vložit sloupec verze do databáze, abych se o souběžné aktualizace staral ručně.

Na tom, zda používáte Spring pro správu transakcí nebo ne, opravdu nezáleží a není relevantní, pokud jde o správu souběžnosti, ve skutečnosti to řeší Hibernate. Hibernate může používat 2 strategie pro zpracování souběžných aktualizací:optimistické zamykání a pesimistické zamykání.

Optimistický

Při použití optimistického zamykání mapujete speciální atribut (číslo, časové razítko) jako verzi (takže na to vlastně máte sloupec). Tato verze se přečte, když načtete entitu a zahrnuta v klauzuli where během aktualizace a zvýšení od Hibernate.

Pro ilustraci, jak to funguje, si představme, že načtete entitu Person s id=1 a s aktuální verzí=1. Po uložení provede Hibernate něco takového:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Nyní si tedy představte, že máte spuštěny dvě souběžné transakce, přičemž každá z nich načítá stejné entity (stejné číslo verze) a změna názvu.

Řekněme, že transakce č. 1 je potvrzena jako první, provede se následující dotaz:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Uspěje a verze se zvýší.

Poté je transakce č. 2 potvrzena, provede se následující dotaz:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Tento nebude nic aktualizovat, protože klauzule where nebude odpovídat žádnému záznamu. Zde získáte optimistickou výjimku souběžnosti.

Tato strategie je vhodná, když neudržujete připojení, když souběžné přístupy nejsou časté a je opravdu dobře škálovatelná. A vše za vás samozřejmě Hibernate zpracuje transparentně, pokud namapujete atribut verze.

Pesimistický

Při použití pesimistického zamykání Hibernate uzamkne záznam pro vaše výhradní použití, dokud s ním neskončíte (obvykle pomocí SELECT ... FOR UPDATE ). Jakákoli další souběžná transakce pokoušející se o přístup ke stejnému záznamu bude pozastavena, dokud nebude zámek odstraněn. Tato strategie poskytuje lepší předvídatelnost za cenu výkonu a není škálovatelná donekonečna.

Odkazy

  • Referenční příručka Hibernate Core
    • 11.3. Optimistická kontrola souběžnosti
    • 11.4. Pesimistické zamykání


  1. Změna databázového řazení, Ctype v Postgresql

  2. Oprávnění odepřeno při pokusu o import souboru CSV z PGAdmin

  3. Funkce AVG() v PostgreSQL

  4. SQL Server Kumulativní součet podle skupiny