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)