TransactionRequiredException Error

1. Oversikt

I denne opplæringen skal vi undersøke årsaken til TransactionRequiredException feil og hvordan du løser det.

2. TransactionRequiredException

Denne feilen oppstår vanligvis når vi prøver å utføre en databaseoperasjon som endrer databasen uten en transaksjon.

For eksempel å prøve å oppdatere en post uten en transaksjon:

Query updateQuery = session.createQuery ("UPDATE Innlegg p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, tittel); updateQuery.setParameter (2, body); updateQuery.setParameter (3, id); updateQuery.executeUpdate ();

Vil heve et unntak med en melding i følgende linjer:

... javax.persistence.TransactionRequiredException: Utføre en oppdatering / slett spørring på org.hibernate.query.internal.AbstractProducedQuery.executeUpdate (AbstractProducedQuery.java:1586) ...

3. Gi en transaksjon

Den åpenbare løsningen er å pakke inn databasemodifiserende operasjoner i en transaksjon:

Transaksjon txn = session.beginTransaction (); Query updateQuery = session.createQuery ("UPDATE Post p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, tittel); updateQuery.setParameter (2, body); updateQuery.setParameter (3, id); updateQuery.executeUpdate (); txn.commit ();

I kodebiten ovenfor starter vi og begår transaksjonen manuelt. Selv om i et Spring Boot-miljø kan vi oppnå dette ved å bruke @Transaksjonell kommentar.

4. Transaksjonsstøtte om våren

Hvis vi vil ha mer finkornet kontroll, kan vi bruke vårens TransactionTemplate. Fordi dette gjør at programmereren kan utløse utholdenheten til et objekt umiddelbart før du fortsetter med kodeutførelsen av en metode.

La oss for eksempel si at vi vil oppdatere innlegget før vi sender et e-postvarsel:

offentlig ugyldig oppdatering () {entityManager.createQuery ("UPDATE Post p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // parameters .executeUpdate (); Send e-post(); }

Bruke @Transaksjonell til metoden ovenfor kan føre til at e-posten sendes til tross for et unntak i oppdateringsprosessen. Dette er fordi transaksjonen bare vil bli begått når metoden avsluttes og er i ferd med å gå tilbake til den som ringer.

Derfor oppdaterer du innlegget innen en TransactionTemplate vil forhindre dette scenariet da det vil utføre operasjonen umiddelbart:

offentlig ugyldig oppdatering () {transactionTemplate.execute (transactionStatus -> {entityManager.createQuery ("UPDATE Post p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // parametere. executeUpdate (); transactionStatus.flush (); return null;}); Send e-post(); }

5. Konklusjon

Avslutningsvis er det generelt god praksis å pakke inn databasedriften i en transaksjon. Det hjelper til med å forhindre korrupsjon av data. Den komplette kildekoden er tilgjengelig på Github.


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