Kdy Spring vyhodnotí anotace @Transactional na CgLib proxy třídách

 

Testování transakční logiky vaší aplikace je obvykle poměrně problematické, pokud využíváte aspektového přístupu Spring frameworku. Ačkoliv existují způsoby řešení tohoto problému, nejsou zadarmo a nejsou přímočaré. Navíc jsme si jako programátoři příliš zvykli spoléhat na to, že jednoduché deklarování @Transactional anotace prostě funguje, takže často testy ani nepíšeme. Spring framework sám dokumentuje některé případy, kdy se jeho transakční logika (ne)aplikuje:

  • ve výchozím nastavení se transakce rollbackuje pouze pokud metoda skončí nekontrolovanou vyjímkou (unchecked exception)
  • rollback se provádí pro vyjímky definované v atributu rollback-for anotace (XML elementu) pokud je definován
  • rollback se neprovádí pro vyjímky definované v atributu no-rollback-for anotace (XML elementu) pokud je definován
  • transakce bude zahájena pouze pro "externí" volání metody beany (tj. v případě, že externí volání využívá metodu bez definované @Transactional anotace a tato následně zavolá ve svém těle další metodu stejné beany, která již tuto anotaci má, transakce nebude započata, protože toto volání jde již jen "uvnitř" dané beany)

Bohužel je tu ještě jedno pravidlo, které již tak zdokumentované není - anotace @Transactional musí být při inicializaci Spring kontextu transakční logikou NALEZENA. To obvykle je, nicméně, pokud používáte CgLib proxy (proxy-target-class) je tu jeden háček, který může znamenat, že Spring vámi deklarované @Transactional anotace nenalezne, i když je na metodách třídy, na základě které CgLib proxy vznikla, definované máte.

(článek je pouze v angličtině)

 

Diskuzní příspěvky
Zatím zde nejsou žádné zprávy