Hogyan ténylegesen dolgoznak @transactional tavaszi blog Anatolij Korszakov

Ebben a cikkben, akkor száll le a labirintus menedzsment ügyletek tavaszi keret. Nézzük meg, hogyan kell építeni a „motorháztető” munka @Transactional kommentárokat.

JPA lebonyolításában

Fontos megjegyezni, hogy a JPA leírás önmagában nem nyújt semmilyen deklaratív tranzakció kezelésére. Ha JPA di (Függőség Injection) konténer tranzakciós szoftver által vezérelt fejlesztő:

Egy ilyen ellenőrzési módszer az ügylet annak átláthatóságát kódot, de van néhány hátránya:

  • Sok ismétlődő kódot, és hajlamos arra, hogy egy hibás viselkedés
  • Bármilyen hiba egy nagyon nagy hatással
  • Hibák nehéz a hibakeresés és a játék
  • Ez megnehezíti kód olvashatóságát
  • Mi a teendő, ha az eljárás hívások egy másik módszer, hogy tranzakciókat?

Az általunk használt kommentár Spring @Transactional

C annotáció @Transactional, egy példa lehet egyszerűsíteni az alábbiak szerint:

Ez a kód sokkal kényelmesebb és jól olvasható legyen, és abban a pillanatban, akkor ajánlott használni ezt a megközelítést tranzakció kezelésére tavaszán.

Segítségével @Transactional, sok fontos szempont, hogy az ügylet elterjedését (szaporítás) automatikusan dolgozzák fel. Ebben az esetben, ha egy másik eljárás kerül meghívásra, a tranzakció módja businessLogic (), ez a módszer végre, hogy egyesítsük a tranzakciót.

Egy hátránya még mindig ott van: nehéz megérteni, hogyan működik a belsejében, ez a hatékony mechanizmus és nehéz a hibakeresés, ha hiba történik.

Mit jelent @Transactional?

Az egyik legfontosabb ismereteket @Transactional, hogy van két különböző fogalom megfontolásra, amelyek mindegyike saját tevékenységi terület és az életciklus:

  • perzisztencia kontextus
  • adatbázis-tranzakció

Abstract maga határozza meg a hatálya egyetlen adatbázis-tranzakció. DB ügylet bekövetkezik az akció perzisztencia kontextus.

Perzisztencia kontextus JPA EntityManager, az osztályban, amely felhasználja Session ORM-keret Hibernate (ha például a perzisztencia szolgáltató Hibernate).

Perzisztencia keretében egy objektum-sinhronayzer, amely nyomon követi az állam korlátozott a Java objektumok és szinkronizálja a változásokat az állam ezeket a létesítményeket az állam a megfelelő rekordok az adatbázisban.

Egy entitás menedzser objektum nem mindig felel meg az azonos adatbázis-tranzakció. Egy entitás menedzser objektum használható többszörös tranzakciókat tárol.

Amikor EntityManager borító több tranzakció adatbázisban?

A leggyakoribb eset fordul elő, amikor egy alkalmazás sablon «Nyílt Session View» megelőzése kizárásával „lusta” elindulni.

Ebben az esetben a lekérdezéseket lehet tenni egy tranzakciót egy hívást a szolgáltatás réteg, végeznek külön ügyletek egy réteg nézet, de ezek segítségével folytatják ugyanazt Entity menedzsere.

Egy másik eset az, amikor egy perzisztencia kontextusban, amelyet a fejlesztő, mint egy PersistenceContextType.EXTENDED, ami azt jelenti, hogy az alkalmazás antipattern „egy munkamenetet az alkalmazást.”

Ez határozza meg a kapcsolat a tranzakciós és EntityManager?

Természetesen minden fejlesztő maga dönti el, de a leggyakoribb választás az, hogy a JPA Entity Manager a stratégia „egy Entity Manager alkalmazás egyetlen tranzakciót.” A következő kód azt mutatja, hogyan lehet megvalósítani az Entity Manager Bean:

Ebben a példában az alapértelmezett működési mód a „One Entity Manager alkalmazás egyetlen tranzakciót.” Ebben az üzemmódban, ha használjuk az Entity Manager eljárás jelölt kommentár @Transactional, akkor ez a módszer kerül sor egy adatbázisban tranzakciót.

Hogyan működik @PersistenceContext?

Egy kérdés jut eszembe, hogyan lehet végrehajtani @PersistenceContext egység vezetője egyszer elején a tartály, tekintettel arra, hogy az élettartama a gazdálkodó vezetők kevés és azok általában több kell egy-egy kérés?

A válasz: nem. Entity Manager a felületet, és akkor vezetjük be a bin önmagában nem entitás menedzser kontextusfüggő proxy, amely lehet ruházni egy adott szervezet vezetője futás közben.

Általában ez az adott osztály használják proxy SharedEntityManagerInvocationHandler, amely lehet meghatározni a hibakereső.

Hogyan, akkor működik @Transactional?

Proxy perzisztencia kontextus imlementiruet EntityManager nem elegendő az elemek végrehajtása tranzakció kezelésére deklaratív. Tény, hogy szükség van a három összetevőből áll:

  • Proxy Entity menedzser
  • szempontja az ügylet
  • tranzakció manager

Nézzük az egyes és nézd meg a kölcsönhatásokat.

szempontja az ügylet

Aspect egy tranzakció - «körül» szempont, amely az úgynevezett előtt és után az üzleti a jegyzetekkel ellátott módszer. Egy speciális osztály végrehajtására ezen aspektusa ennek TransactionInterceptor.

Aspect az ügylet két fő funkciója van:

  • Abban idő „előtt” szempont határozza meg, hogy az eljárás végrehajtására belül végrehajtott már suschestuvuyuschey adatbázis-tranzakció, vagy egy új külön tranzakció kell kezdeni.
  • Abban az időben a „után” szempont határozza meg, mi köze a tranzakció nem követ el, visszavonása vagy hagyja fedetlen.

Abban az időben az „előtte” szempont önmagában nem tartalmaz semmilyen logika a döntés, a döntés, hogy indul egy új tranzakció, ha szükséges, felhatalmazott Transaction Manager.

Tranzakciós manager

tranzakciók remek menedzser kell válaszolni két kérdésre:

  • Akár egy új entitás menedzser?
  • Amennyiben új adatbázis-tranzakció e kezdeni?

A válaszokat kell adnia, amikor a tranzakció hívják szempontjai logikai idején az „előtte”. tranzakció manager dönt alapján a következő tényeket:

  • végezni, ha legalább egy tranzakciót a jelenlegi pillanatban nincs
  • attribútum «szaporítás» eljárásában jegyzetekkel @Transactional (például REQUIRES_NEW mindig elindul egy új tranzakció).

Ha a menedzser úgy döntött, hogy létrehoz egy új ügylet, akkor:

  • Egy új szervezet vezetője
  • „Binding» szervezet vezetője, hogy az aktuális szál (thread)
  • „Capture” vegyület egy tárolón keresztül
  • A „kötődése” a kapcsolat az aktuális áramlási

És az egység vezetője és a vegyület kötődik az aktuális téma, egy ThreadLocal változókat.

Ezek tárolják a falon, amíg a tranzakció befejeződött, majd továbbítják a tranzakció manager tisztítására, mivel ezek már nem lesz szükség.

Bármilyen program része, amelynek szüksége van az aktuális entitás menedzser vagy vegyület lehet kapni őket a falról. Ez az összetevő a program, ami úgy van az Entity menedzsere Proxy.

EntityManager proxy

Proxy Entity menedzser (melyet korábban bevezetett) az utolsó puzzle-darabot szakaszosan. Ha egy üzlet eljárás hívást kezdeményezünk, például entityManager.persist (). A hívás nem indul közvetlenül a szervezet vezetője.

Ehelyett, az üzleti metódushívások a proxy, amely megkapja az aktuális entitás vezetője a patak, amelyben fel a tranzakció vezetője.

Ismerve őt minden részét @Transactional mechanizmus, menjünk át a szokásos tavaszi konfigurációt meg kell működtetni az egészet.

Elhelyezés a teljes puzzle együtt

Nézzük leírják a konfiguráció a három komponens megfelelő működéséhez szükséges @Transactional kommentárokat. Kezdjük meghatározásával Entity menedzsere Factory.

Ez lehetővé teszi a Proxy Entity Manager adja át kommentár @PersistenceContext:

Pre Következő lépés fogja beállítani az ügylet menedzser és alkalmazza szempontjai tranzakciók osztályok jegyzetekkel @Transactional:

Abstract tavaszi @EnableTransactionManagement jelzi, hogy az osztályok jegyzetekkel együtt @Transactional, be kell csomagolni tranzakciós szempont. Most már használhatja kommentár @Transactional.

következtetés

deklaratív ellenőrzési mechanizmus benyújtott tranzakciók keret Spring, erős persze, de lehet helytelenül használják, és könnyen összetéveszthető konfigurációt.

Ha megértjük, hogyan működik ez nagyon hasznos a problémák megoldására, ha a mechanizmus nem működik, mint várták.

A legfontosabb dolog, hogy mindig szem előtt tartani, hogy van két olyan fogalmat kell figyelembe venni: az adatbázis tranzakció és kitartás összefüggésben mindegyik saját, nem nyilvánvaló életciklusa alatt.

(Meglátogatott 3457-szer, 28 látogatók ma)

Ossza meg ezt a linket: