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ó.