Povolenie blokovania transakcií na jar JPA

1. Prehľad

V tomto rýchlom výučbe sa budeme zaoberať povolením zámkov transakcií v Spring Data JPA pre vlastné metódy dotazu a preddefinované metódy CRUD úložiska.

Taktiež sa pozrieme na rôzne typy zámku a nastavenie časových limitov uzamknutia transakcie.

2. Typy zámku

JPA má definované dva hlavné typy zámku, ktorými sú pesimistické uzamknutie a optimistické uzamknutie.

2.1 Pesimistické uzamykanie

Keď v transakcii používame pesimistické uzamykanie a pristupujeme k entite, okamžite sa uzamkne. Transakcia uvoľní zámok buď potvrdením alebo vrátením transakcie späť.

2.2 Optimistické blokovanie

V prípade optimistického blokovania transakcia nezamkne entitu okamžite. Namiesto toho transakcia bežne ukladá stav entity s priradeným číslom verzie.

Keď sa pokúsime aktualizovať stav entity v inej transakcii, transakcia počas aktualizácie porovná uložené číslo verzie s číslom existujúcej verzie.

Ak sa v tomto okamihu líši číslo verzie, znamená to, že entitu nie je možné upraviť. Ak existuje aktívna transakcia, táto transakcia sa vráti späť a príslušná implementácia spoločného parlamentného zhromaždenia vyhodí znak OptimisticLockException.

Okrem prístupu k číslu verzie môžeme použiť ďalšie prístupy, ako sú časové pečiatky, výpočet hodnôt hash alebo sériový kontrolný súčet, podľa toho, ktorý prístup je pre náš súčasný vývojový kontext najvhodnejší.

3. Povolenie blokovania transakcií pri dotazovacích metódach

Aby sme získali zámok na entite, môžeme anotovať metódu cieľového dotazu pomocou a Zamknúť anotáciu odovzdaním požadovaného typu režimu uzamknutia.

Typy režimu uzamknutia sú hodnoty výčtu, ktoré sa majú určiť pri uzamknutí entity. Zadaný režim uzamknutia sa potom rozšíri do databázy, aby sa použil zodpovedajúci zámok na objekt entity.

Ak chcete určiť zámok na vlastnú metódu dotazu úložiska Spring Data JPA, môžeme metódu anotovať @Lock a zadajte požadovaný typ režimu uzamknutia:

@Lock (LockModeType.OPTIMISTIC_FORCE_INCREMENT) @Query ("SELECT c OD ZÁKAZNÍKA c WHERE c.orgId =? 1") public List fetchCustomersByOrgId (Long orgId);

Ak chcete vynútiť uzamknutie preddefinovaných metód úložiska, ako je napr findAll alebo findById (id), musíme deklarovať metódu v úložisku a anotovať metódu pomocou Zamknúť anotácia:

@Lock (LockModeType.PESSIMISTIC_READ) public Voliteľné findById (Long customerId);

Keď je zámok výslovne povolený a neexistuje žiadna aktívna transakcia, podkladová implementácia JPA vrhá a TransactionRequiredException.

V prípade, že zámok nie je možné udeliť a konflikt uzamknutia nemá za následok vrátenie transakcie, hodí JPA a LockTimeoutException. Neznamená to však aktívnu transakciu kvôli vráteniu.

4. Nastavenie časových limitov uzamknutia transakcie

Pri použití pesimistického blokovania sa databáza pokúsi entitu okamžite uzamknúť. Základná implementácia JPA vrhá a LockTimeoutException keď zámok nemožno získať okamžite. Aby sme sa vyhli takýmto výnimkám, môžeme určiť hodnotu časového limitu zámku.

V Spring Data JPA je možné určiť časový limit zámku pomocou QueryHints anotáciu vložením a QueryHint o metódach dotazu:

@Lock (LockModeType.PESSIMISTIC_READ) @QueryHints ({@ QueryHint (name = "javax.persistence.lock.timeout", value = "3000")}) public Voliteľné findById (dlhé číslo zákazníka);

Ďalšie podrobnosti o nastavení možnosti časového limitu uzamknutia pre rôzne rozsahy nájdete v tomto článku o ObjectDB.

5. Záver

V tomto tutoriáli sme sa naučili rôzne typy režimov blokovania transakcií. Naučili sme sa, ako povoliť transakčné zámky v Spring Data JPA. Pokryli sme tiež nastavenie časových limitov nastavenia zámku.

Aplikácia správnych transakčných zámkov na správnych miestach môže pomôcť zachovať integritu údajov v aplikáciách na veľké množstvo aplikácií na súčasné použitie.

Ak transakcia musí striktne dodržiavať pravidlá ACID, mali by sme použiť pesimistické blokovanie. Optimistické blokovanie by sa malo použiť, keď potrebujeme umožniť viac súbežných čítaní a keď je v kontexte aplikácie prijateľná prípadná konzistencia.

Vzorový kód pre pesimistické uzamknutie aj optimistické uzamknutie samozrejme nájdete na stránkach Github.


$config[zx-auto] not found$config[zx-overlay] not found