Transakcije s Springom i JPA

1. Pregled

Ovaj tutorial će raspravljati pravi način konfiguriranja proljetnih transakcija, kako koristiti @Transational anotacija i uobičajene zamke.

Za detaljniju raspravu o konfiguraciji postojanosti jezgre, pogledajte tutorial Spring with JPA.

U osnovi postoje dva različita načina za konfiguriranje transakcija - bilješke i AOP - svaki sa svojim prednostima. Ovdje ćemo razgovarati o uobičajenijim napomenama-config.

2. Konfigurirajte transakcije

Predstavlja proljeće 3.1 the @EnableTransactionManagement bilješka koje možemo koristiti u a @Konfiguracija klasa i omogućiti transakcijsku podršku:

@Configuration @EnableTransactionManagement javna klasa PersistenceJPAConfig {@Bean public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean () {// ...} @Bean public PlatformTransactionManageractionManager () {JpaTransactionManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManagerManager actionManager.setEntityManagerFactory (entityManagerFactoryBean (). getObject ()); vratiti transakcijuManager; }}

Međutim, ako koristimo projekt Spring Boot, a na putu predavanja imamo ovisnosti spring-data- * ili spring-tx, tada će upravljanje transakcijama biti zadano prema zadanim postavkama.

3. Konfigurirajte transakcije s XML-om

Prije 3.1 ili ako Java nije opcija, evo XML konfiguracije pomoću anotacijom vođen i podrška prostora imena:

4. The @Transational Bilješka

S konfiguriranim transakcijama, sada možemo bilježiti grah @Transational bilo na razini klase ili metode:

@Service @Transactional javna klasa FooService {// ...}

Bilješka podržava daljnja konfiguracija također:

  • the Vrsta razmnožavanja transakcije
  • the Razina izolacije transakcije
  • a Pauza za operaciju umotanu u transakciju
  • a readOnly flag - savjet za pružatelja trajnosti da transakciju treba čitati samo
  • the Vraćanje pravila za transakciju

Imajte na umu da se - prema zadanim postavkama vraćanje događa samo za vrijeme izvođenja, izvan potvrđenih iznimki. Označena iznimka ne pokreće povrat transakcije. To ponašanje možemo, naravno, konfigurirati pomoću vraćanje za i noRollbackFor parametri bilješki.

5. Potencijalne zamke

5.1. Transakcije i opunomoćenici

Na visokoj razini, Spring stvara proxyje za sve razrede označene s @Transational - bilo na nastavi ili bilo kojoj od metoda. Proxy omogućuje okviru da ubrizgava transakcijsku logiku prije i nakon pokrenute metode - uglavnom za pokretanje i predavanje transakcije.

Važno je imati na umu da će, ako transakcijski grah implementira sučelje, po defaultu proxy biti Java Dynamic Proxy. To znači da će se presresti samo pozivi vanjske metode koji dolaze putem proxyja. Bilo koji poziv samopozivom neće pokrenuti nijednu transakciju, čak i ako metoda ima @Transational bilješka.

Još jedno upozorenje korištenja opunomoćenika je to treba bilježiti samo javne metode @Transational. Metode bilo koje druge vidljivosti jednostavno će ignorirati napomene u tišini jer one nisu proksi.

Ovaj članak ovdje detaljno raspravlja o daljnjim zamkama proksiranja.

5.2. Promjena razine izolacije

Također možemo promijeniti razinu izolacije transakcije:

@Transactional (isolation = Isolation.SERIALIZABLE)

Imajte na umu da je ovo zapravo predstavljeno u proljeće 4.1; ako gornji primjer pokrenemo prije proljeća 4.1, rezultirat će:

org.springframework.transaction.InvalidIsolationLevelException: Standardni JPA ne podržava prilagođene razine izolacije - koristite posebnu JpaDialect za vašu provedbu JPA

5.3. Transakcije samo za čitanje

The samo za čitanje zastava obično stvara zabunu, posebno kada se radi s JPA; iz Javadoca:

Ovo samo služi kao savjet za stvarni transakcijski podsustav; hoće Nije nužno uzrokuju neuspjeh pokušaja pristupa upisivanju. Upravitelj transakcija koji ne može protumačiti savjet samo za čitanje ne izuzetak kada se zatraži transakcija samo za čitanje.

Činjenica je da ne možemo biti sigurni da se umetanje ili ažuriranje neće dogoditi kada se samo za čitanje postavljena je zastava. Ovo ponašanje ovisi o dobavljaču, dok je JPA agnostik dobavljača.

Također je važno to razumjeti the samo za čitanje zastava je relevantna samo unutar transakcije. Ako se operacija dogodi izvan transakcijskog konteksta, zastava se jednostavno zanemaruje. Jednostavan primjer toga nazvao bi metodu označenu s:

@Transactional (propagation = Propagation.SUPPORTS, readOnly = true)

iz ne-transakcijskog konteksta - transakcija se neće stvoriti i samo za čitanje zastava će se zanemariti.

5.4. Zapisivanje transakcija

Korisna metoda za razumijevanje problema povezanih s transakcijama je fino podešavanje evidentiranja u transakcijskim paketima. Relevantni paket u proljeće je „org.springframework.transaction ”, koji bi trebao biti konfiguriran s razinom evidentiranja TRACE.

6. Zaključak

Obuhvatili smo osnovnu konfiguraciju transakcijske semantike koristeći i Java i XML, kako koristiti @Transational i najbolje prakse transakcijske strategije.

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na Githubu.