TransactionRequiredException hiba

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk a TransactionRequiredException hiba és hogyan lehet megoldani.

2. TransactionRequiredException

Ez a hiba általában akkor fordul elő, amikor olyan adatbázis-műveletet próbálunk végrehajtani, amely tranzakció nélkül módosítja az adatbázist.

Például rekord törlése tranzakció nélkül:

Lekérdezés updateQuery = session.createQuery ("UPDATE Post p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, cím); updateQuery.setParameter (2, törzs); updateQuery.setParameter (3, id); updateQuery.executeUpdate ();

Kivételt fog felvenni egy üzenettel a következő mentén:

... javax.persistence.TransactionRequiredException: Frissítési / törlési lekérdezés végrehajtása az org.hibernate.query.internal.AbstractProducedQuery.executeUpdate (AbstractProducedQuery.java:1586) webhelyen ...

3. Tranzakció lebonyolítása

A nyilvánvaló megoldás az, hogy minden adatbázis-módosító műveletet be kell vonni egy tranzakcióba:

Tranzakció txn = session.beginTransaction (); Lekérdezés updateQuery = session.createQuery ("UPDATE Post p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, cím); updateQuery.setParameter (2, törzs); updateQuery.setParameter (3, id); updateQuery.executeUpdate (); txn.vállalás ();

A fenti kódrészletben kézzel kezdeményezzük és elkövetjük a tranzakciót. Habár Spring Boot környezetben ezt elérhetjük a @ Tranzakció annotáció.

4. Tranzakciók támogatása tavasszal

Ha finomabb szemléletű kontrollt akarunk, használhatjuk a Spring-et TransactionTemplate. Mivel ez lehetővé teszi a programozó számára, hogy közvetlenül egy metódus végrehajtása előtt kiváltsa az objektum perzisztenciáját.

Tegyük fel például, hogy frissíteni szeretnénk a bejegyzést, mielőtt e-mail értesítést küldünk:

public void update () {entitManager.createQuery ("UPDATE Post p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // paraméterek .executeUpdate (); küldjön e-mailt(); }

A @ Tranzakció a fenti módszerhez az e-mail elküldését okozhatja a frissítési folyamat kivételével. Ennek oka, hogy a tranzakció csak akkor kerül végrehajtásra, amikor a módszer kilép, és hamarosan visszatér a hívóhoz.

Ezért a bejegyzés frissítése a TransactionTemplate megakadályozza ezt a forgatókönyvet, mivel azonnal végrehajtja a műveletet:

public void update () {tranzakcióTemplate.execute (tranzakcióStatus -> {entitásManager.createQuery ("UPDATE Post p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // paraméterek .executeUpdate () ;actionStatus.flush (); return null;}); küldjön e-mailt(); }

5. Következtetés

Összegzésképpen elmondható, hogy általában jó gyakorlat az adatbázis-műveleteket tranzakcióba csomagolni. Segít az adatsérülés megelőzésében. A teljes forráskód elérhető a Github oldalon.


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