Tranzakciós zárak engedélyezése a Spring Data JPA-ban

1. Áttekintés

Ebben a gyors bemutatóban megvitatjuk a tranzakciós zárak engedélyezését a Spring Data JPA-ban az egyéni lekérdezési módszerek és az előre definiált repository CRUD-módszerek számára.

Ezenkívül áttekintjük a különféle zárolási típusokat és a tranzakciós zár időkorlátjait.

2. Zár típusok

A JPA két fő zárolási típust határoz meg, ezek a pesszimista zárolás és az optimista zár.

2.1 Pesszimista zárolás

Amikor egy tranzakció során pesszimista zárolást használunk, és hozzáférünk egy entitáshoz, akkor az azonnal lezárásra kerül. A tranzakció a tranzakció végrehajtásával vagy visszagörgetésével oldja fel a zárat.

2.2 Optimista zár

Az Optimistikus zárolásban a tranzakció nem zárja le azonnal az entitást. Ehelyett a tranzakció általában elmenti az entitás állapotát a hozzá rendelt verziószámmal.

Amikor egy másik tranzakcióban megpróbáljuk frissíteni az entitás állapotát, a tranzakció a frissítés során összehasonlítja a mentett verziószámot a meglévő verziószámmal.

Ezen a ponton, ha a verziószám eltér, ez azt jelenti, hogy az entitást nem lehet módosítani. Ha van aktív tranzakció, akkor a tranzakció visszavonásra kerül, és az alapul szolgáló JPA megvalósítás egy OptimisticLockException.

A verziószám megközelítésen kívül más megközelítéseket is alkalmazhatunk, például időbélyegeket, hash érték kiszámítást vagy sorosított ellenőrző összeget, attól függően, hogy melyik megközelítés a legalkalmasabb a jelenlegi fejlesztési kontextusunkhoz.

3. Tranzakciós zárak engedélyezése lekérdezési módszereken

Az entitás zárolásának megszerzéséhez a céllekérdezési metódust a-val jelölhetjük Zár megjegyzés a kívánt zárolási mód típusának átadásával.

A zárolási mód típusai az entitás zárolása során megadandó értékek. A megadott zárolási mód azután továbbkerül az adatbázisba, hogy a megfelelő zárat alkalmazza az entitásobjektumra.

A Spring Data JPA adattár egyéni lekérdezési módszerének zárolásának megadásához a módszerrel feljegyezhetjük a metódust @Zár és adja meg a kívánt zárolási módot:

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

A zárolás kikényszerítése az előre definiált repository módszereken, mint pl Találd meg mindet vagy findById (id), deklarálnunk kell a metódust a lerakatban, és a metódussal jegyzeteljük a Zár kommentár:

@Lock (LockModeType.PESSIMISTIC_READ) public Opcionális findById (Long customerId);

Ha a zárolás kifejezetten engedélyezve van, és nincs aktív tranzakció, az alapul szolgáló JPA-megvalósítás a-t dobja TransactionRequiredException.

Abban az esetben, ha a zár nem adható meg, és a zárolási ütközés nem eredményez tranzakció visszagörgetést, a JPA a LockTimeoutException. De nem jelöli vissza az aktív tranzakciót.

4. A tranzakciózár időkorlátjának beállítása

A Pesszimista zárolás használatakor az adatbázis azonnal megpróbálja lezárni az entitást. A mögöttes JPA-megvalósítás a LockTimeoutException amikor a zárat nem lehet azonnal megszerezni. Az ilyen kivételek elkerülése érdekében megadhatjuk a zár időkorlátját.

A Spring Data JPA-ban a zárolás időkorlátja a QueryHints annotáció a QueryHint a lekérdezési módszerekről:

@Lock (LockModeType.PESSIMISTIC_READ) @QueryHints ({@ QueryHint (név = "javax.persistence.lock.timeout", value = "3000")}) public Opcionális findById (Long customerId);

A zárolási időtúllépés különböző hatókörökre történő beállításának további részletei megtalálhatók ebben az ObjectDB cikkben.

5. Következtetés

Ebben az oktatóanyagban megtanultuk a különböző típusú tranzakciós zárolási módokat. Megismertük, hogyan lehet engedélyezni a tranzakciós zárakat a Spring Data JPA-ban. Kitértünk a zárolás időkorlátjának beállítására is.

A megfelelő tranzakciós zárak alkalmazása a megfelelő helyeken elősegítheti az adatok integritásának fenntartását a nagy volumenű egyidejű használatú alkalmazásokban.

Amikor a tranzakciónak szigorúan be kell tartania az ACID szabályokat, akkor használnunk kell a Pesszimista zárolást. Optimista zárolást kell alkalmazni, ha több egyidejű olvasást kell engedélyeznünk, és amikor az alkalmazás konzisztenciája elfogadható az alkalmazáson belül.

Természetesen a pesszimista zárolás és az optimista zárolás mintakódja a Github oldalon található.


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