Transactievergrendelingen inschakelen in Spring Data JPA

1. Overzicht

In deze korte zelfstudie bespreken we het inschakelen van transactievergrendelingen in Spring Data JPA voor aangepaste querymethoden en vooraf gedefinieerde CRUD-methoden voor opslagplaatsen.

We zullen ook kijken naar verschillende vergrendelingstypen en het instellen van time-outs voor transactievergrendeling.

2. Soorten sloten

JPA heeft twee hoofdvergrendelingstypen gedefinieerd, namelijk pessimistische vergrendeling en optimistische vergrendeling.

2.1 Pessimistische vergrendeling

Wanneer we pessimistische vergrendeling gebruiken in een transactie en toegang krijgen tot een entiteit, wordt deze onmiddellijk vergrendeld. De transactie heft de vergrendeling op door de transactie vast te leggen of terug te draaien.

2.2 Optimistische vergrendeling

In Optimistic Locking vergrendelt de transactie de entiteit niet onmiddellijk. In plaats daarvan slaat de transactie gewoonlijk de staat van de entiteit op met een versienummer dat eraan is toegewezen.

Wanneer we proberen de status van de entiteit bij te werken in een andere transactie, vergelijkt de transactie het opgeslagen versienummer met het bestaande versienummer tijdens een update.

Als het versienummer op dit punt verschilt, betekent dit dat de entiteit niet kan worden gewijzigd. Als er een actieve transactie is, wordt die transactie teruggedraaid en zal de onderliggende JPA-implementatie een OptimisticLockException.

Afgezien van de versienummerbenadering, kunnen we andere benaderingen gebruiken, zoals tijdstempels, hashwaardeberekening of geserialiseerde checksum, afhankelijk van welke benadering het meest geschikt is voor onze huidige ontwikkelingscontext.

3. Transactievergrendelingen inschakelen voor zoekmethoden

Om een ​​vergrendeling op een entiteit te verkrijgen, kunnen we de doelquery-methode annoteren met een Slot annotatie door het vereiste type vergrendelingsmodus door te geven.

De typen vergrendelingsmodi zijn opsommingswaarden die moeten worden opgegeven tijdens het vergrendelen van een entiteit. De gespecificeerde vergrendelingsmodus wordt vervolgens doorgegeven aan de database om de overeenkomstige vergrendeling op het entiteitsobject toe te passen.

Om een ​​vergrendeling op een aangepaste querymethode van een Spring Data JPA-repository te specificeren, kunnen we de methode annoteren met @Slot en specificeer het vereiste type vergrendelingsmodus:

@Lock (LockModeType.OPTIMISTIC_FORCE_INCREMENT) @Query ("SELECTEER c VAN klant c WAAR c.orgId =? 1") openbare lijst fetchCustomersByOrgId (lange orgId);

Om de vergrendeling op vooraf gedefinieerde opslagplaatsmethoden af ​​te dwingen, zoals vind alle of findById (id), we moeten de methode binnen de repository declareren en de methode annoteren met de Slot annotatie:

@Lock (LockModeType.PESSIMISTIC_READ) public Optioneel findById (Long customerId);

Wanneer het slot expliciet is ingeschakeld en er geen actieve transactie is, genereert de onderliggende JPA-implementatie een TransactionRequiredException.

In het geval dat de vergrendeling niet kan worden verleend en het vergrendelingsconflict niet resulteert in een terugdraaiing van de transactie, gooit JPA een LockTimeoutException. Maar het markeert de actieve transactie niet voor terugdraaien.

4. Time-outs voor transactievergrendeling instellen

Bij gebruik van Pessimistic Locking zal de database proberen de entiteit onmiddellijk te vergrendelen. De onderliggende JPA-implementatie gooit een LockTimeoutException wanneer het slot niet onmiddellijk kan worden verkregen. Om dergelijke uitzonderingen te vermijden, kunnen we de time-outwaarde voor vergrendeling specificeren.

In Spring Data JPA kan de lock-time-out worden gespecificeerd met de QueryHints annotatie door een QueryHint op zoekmethoden:

@Lock (LockModeType.PESSIMISTIC_READ) @QueryHints ({@ QueryHint (name = "javax.persistence.lock.timeout", value = "3000")}) openbaar Optioneel findById (lange klant-id);

Meer informatie over het instellen van de time-outhint voor vergrendeling op verschillende bereiken vindt u in dit ObjectDB-artikel.

5. Conclusie

In deze zelfstudie hebben we de verschillende soorten transactievergrendelingsmodi geleerd. We hebben geleerd hoe u transactievergrendelingen in Spring Data JPA kunt inschakelen. We hebben ook de time-outs voor het instellen van vergrendelingen behandeld.

Het toepassen van de juiste transactievergrendelingen op de juiste plaatsen kan helpen om de gegevensintegriteit te behouden in toepassingen met veel gelijktijdig gebruik.

Als de transactie strikt aan de ACID-regels moet voldoen, moeten we Pessimistic Locking gebruiken. Optimistische vergrendeling moet worden toegepast wanneer we meerdere gelijktijdige uitlezingen moeten toestaan ​​en wanneer de uiteindelijke consistentie acceptabel is binnen de toepassingscontext.

Natuurlijk is de voorbeeldcode voor zowel Pessimistic Locking als Optimistic Locking te vinden op Github.