Pogreška TransactionRequiredException

1. Pregled

U ovom uputstvu ispitat ćemo uzrok TransactionRequiredException pogreška i kako je riješiti.

2. TransactionRequiredException

Ta se pogreška obično javlja kada pokušavamo izvesti operaciju baze podataka koja modificira bazu podataka bez transakcije.

Na primjer, pokušaj ažuriranja zapisa bez transakcije:

Upit updateQuery = session.createQuery ("AŽURIRANJE objave p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, naslov); updateQuery.setParameter (2, tijelo); updateQuery.setParameter (3, id); updateQuery.executeUpdate ();

Potaknut će iznimku s porukom u sljedećim redovima:

... javax.persistence.TransactionRequiredException: Izvršenje upita za ažuriranje / brisanje na org.hibernate.query.internal.AbstractProducedQuery.executeUpdate (AbstractProducedQuery.java:1586) ...

3. Pružanje transakcije

Očito je rješenje zamotati bilo koju operaciju izmjene baze podataka u transakciju:

Transakcija txn = session.beginTransaction (); Upit updateQuery = session.createQuery ("AŽURIRANJE objave p SET p.title =? 1, p.body =? 2 WHERE p.id =? 3"); updateQuery.setParameter (1, naslov); updateQuery.setParameter (2, tijelo); updateQuery.setParameter (3, id); updateQuery.executeUpdate (); txn.commit ();

U isječku koda gore ručno pokrećemo i izvršavamo transakciju. Iako u Spring Boot okruženju to možemo postići korištenjem @Transational bilješka.

4. Podrška transakcijama u proljeće

Ako želimo više finog zrna, možemo koristiti Spring's TransactionTemplate. Budući da to programeru omogućuje pokretanje postojanosti objekta neposredno prije nastavka izvođenja koda metode.

Na primjer, recimo da želimo ažurirati post prije slanja obavijesti e-poštom:

javno void ažuriranje () {entityManager.createQuery ("AŽURIRANJE objave p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // parametri .executeUpdate (); Pošalji e-mail(); }

Primjenom @Transational prema gore navedenoj metodi može dovesti do slanja e-pošte unatoč iznimci u procesu ažuriranja. To je zato što će se transakcija izvršiti samo kada metoda izađe i sprema se vratiti pozivatelju.

Stoga ažuriranje posta unutar a TransactionTemplate spriječit će ovaj scenarij jer će odmah izvršiti operaciju:

javno void ažuriranje () {actionTemplate.execute (actionStatus -> {entityManager.createQuery ("UPDATE Post p SET p.title =? 2, p.body =? 3 WHERE p.id =? 1") // parametri .executeUpdate (); transactionStatus.flush (); vrati nulu;}); Pošalji e-mail(); }

5. Zaključak

Zaključno, općenito je dobra praksa zamatanje operacija baze podataka u transakciju. Pomaže u sprečavanju oštećenja podataka. Kompletni izvorni kod dostupan je na Githubu.


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