Omogućavanje zaključavanja transakcija u Spring Data JPA

1. Pregled

U ovom brzom vodiču razgovarat ćemo o omogućavanju zaključavanja transakcija u Spring Data JPA za prilagođene metode upita i unaprijed definirane CRUD metode spremišta.

Također ćemo pogledati različite vrste zaključavanja i postaviti vremenska ograničenja zaključavanja transakcija.

2. Vrste brava

JPA ima definirana dva glavna tipa brave, a to su pesimistično zaključavanje i optimistično zaključavanje.

2.1 Pesimistično zaključavanje

Kada u transakciji koristimo pesimističko zaključavanje i pristupimo entitetu, ona će se odmah zaključati. Transakcija oslobađa zaključavanje ili izvršavanjem ili vraćanjem transakcije.

2.2 Optimistično zaključavanje

U Optimističnom zaključavanju, transakcija ne zaključava entitet odmah. Umjesto toga, transakcija obično sprema stanje entiteta s dodijeljenim brojem verzije.

Kada pokušavamo ažurirati stanje entiteta u drugoj transakciji, transakcija uspoređuje spremljeni broj verzije s postojećim brojem verzije tijekom ažuriranja.

U ovom trenutku, ako se broj verzije razlikuje, to znači da entitet nije moguće izmijeniti. Ako postoji aktivna transakcija, tada će se ta transakcija vratiti i osnovna implementacija JPA će izbaciti OptimisticLockException.

Osim pristupa broju verzije, možemo koristiti i druge pristupe poput vremenskih oznaka, izračunavanja hash vrijednosti ili serializirane kontrolne sume, ovisno o tome koji je pristup najprikladniji za naš trenutni razvojni kontekst.

3. Omogućavanje zaključavanja transakcija na metodama upita

Da bismo stekli zaključavanje entiteta, možemo ciljnu metodu upita označiti s Zaključaj napomena prosljeđivanjem potrebne vrste načina zaključavanja.

Vrste načina zaključavanja su vrijednosti nabrajanja koje treba navesti tijekom zaključavanja entiteta. Navedeni način zaključavanja zatim se širi u bazu podataka kako bi primijenio odgovarajuće zaključavanje na objekt entiteta.

Da bismo odredili zaključavanje prilagođene metode upita spremišta Spring Data JPA, možemo je označiti s @Lock i navedite potrebnu vrstu načina zaključavanja:

@Lock (LockModeType.OPTIMISTIC_FORCE_INCREMENT) @Query ("SELECT c FROM Customer c WHERE c.orgId =? 1") javni popis fetchCustomersByOrgId (Long orgId);

Da bi se nametnulo zaključavanje na unaprijed definiranim metodama spremišta poput pronađi sve ili findById (id), moramo deklarirati metodu unutar spremišta i označiti je metodom Zaključaj napomena:

@Lock (LockModeType.PESSIMISTIC_READ) javni Neobvezni findById (Long customerId);

Kada je zaključavanje izričito omogućeno i nema aktivne transakcije, temeljna implementacija JPA izbacit će TransactionRequiredException.

U slučaju da se zaključavanje ne može odobriti i sukob zaključavanja ne rezultira povratom transakcije, JPA baca a LockTimeoutException. Ali to ne označava aktivnu transakciju za povrat.

4. Postavljanje vremenskih ograničenja zaključavanja transakcija

Kada se koristi pesimistično zaključavanje, baza podataka pokušat će odmah zaključati entitet. Temeljna provedba JPA baca a LockTimeoutException kad se bravica ne može dobiti odmah. Da bismo izbjegli takve iznimke, možemo odrediti vrijednost vremenskog ograničenja zaključavanja.

U Spring Data JPA, vremensko ograničenje zaključavanja može se odrediti pomoću QueryHints bilješka postavljanjem a QueryHint o metodama upita:

@Lock (LockModeType.PESSIMISTIC_READ) @QueryHints ({@ QueryHint (name = "javax.persistence.lock.timeout", value = "3000")}) Javni Izborni findById (Long customerId);

Daljnje pojedinosti o postavljanju nagovještaja o vremenskom ograničenju zaključavanja na različitim opsezima mogu se naći u ovom članku ObjectDB.

5. Zaključak

U ovom uputstvu naučili smo različite vrste načina zaključavanja transakcija. Naučili smo kako omogućiti zaključavanje transakcija u Spring Data JPA. Također smo pokrili postavljanje vremenskih ograničenja zaključavanja.

Primjena ispravnih zaključavanja transakcija na pravim mjestima može pomoći u održavanju integriteta podataka u velikim količinama aplikacija za istodobnu upotrebu.

Kada se transakcija mora striktno pridržavati ACID pravila, trebali bismo koristiti pesimistično zaključavanje. Optimistično zaključavanje treba primijeniti kada trebamo omogućiti više istodobnih čitanja i kada je eventualna dosljednost prihvatljiva unutar konteksta aplikacije.

Naravno, uzorak koda i za pesimistično zaključavanje i za optimistično zaključavanje nalazi se na Githubu.