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í