2010-01-02 12 views
5

Nie mogłem znaleźć na ten temat ostatecznej odpowiedzi w dokumentach i chociaż wydaje się, że istnieje logiczna odpowiedź, nie można być pewnym. Scenariusz jest taki - masz definicję transakcji opartą na xml, taką jak:Najważniejsze definicje transakcji oparte na adnotacjach i xml

<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

Która zaleca wszystkie metody obsługi. Ale wtedy masz @Transactional na konkretnej klasie/metodzie, gdzie chcesz zastąpić atrybut propagation.

Oczywistym jest, że na poziomie metody zastępuje ten sam na poziomie klasy, ale czy zastępuje on <tx:advice> (i faktycznie, <aop:pointcut>)?

Mam nadzieję, że dwa kolektory nie zostanie utworzony na tej samej klasy (i cokolwiek dzieje się pierwszy rozpocznie transakcję)

Odpowiedz

4

Podziękowania dla skaffmana za jego wysiłek. Wreszcie myślę, że mam problem:

  1. Zarówno <aop:advisor> i @Transactional (wraz z <tx:annotation-driven>) Tworzenie TransactionInterceptor wokół klasie docelowej (ten, którego metody mają być uruchamiane w transakcji).
  2. Porada o niższym atrybucie order zastępuje drugą. Jeśli nie określono atrybutu zamówienia, zamówienie jest niezdefiniowane. Ale moje testy wykazały, że jeden z definicją najpóźniej w applicationContext.xml ma pierwszeństwo, choć to może nie być tak zawsze:

Gdy dwa rad zdefiniowane w różnych aspektach, zarówno trzeba uruchomić w tym samym punkcie przyłączenia , chyba że postanowisz inaczej, kolejność wykonania jest niezdefiniowana.

Przynajmniej takie jest zachowanie na wiosnę 2.5.6.

3

Po trochę kopania, myślę, że odpowiedź leży w TxAdviceBeanDefinitionParser.doParse. Logika mówi:

if <tx:attributes> is present then 
    parse <tx:attributes> 
else 
    instantiate an AnnotationTransactionAttributeSource to determine TX attributes 

Biorąc jedyną rzeczą, która czyta @Transactional jest AnnotationTransactionAttributeSource, że silnie sugeruje mi, że <tx:advice> skonsultuje @Transactional wtedy i tylko wtedy <tx:attributes> nie jest określona, ​​więc żaden nadrzędny jest możliwe.

Jest to sprzeczne ze zwykłą zasadą "zasady najmniejszego zaskoczenia", ponieważ podobnie jak ty oczekiwałbym, że adnotacja będzie miała pierwszeństwo w stosunku do klasy lub metody. Zgłosiłbym problem na ich JIRA, aby zmienić to zachowanie.

Powiedziawszy to wszystko, nadal uważam, że warto spróbować tego, aby zobaczyć, co robi, ponieważ może działać przez jakiś inny mechanizm.

+0

Co ciekawe, zachowuje się tak, jak się spodziewaliśmy. Zrobię teraz trochę kopania, aby zobaczyć, co więcej jest w TxAdviceBeanDefinitionParser .. – Bozho

+0

Zastanawiam się, czy proxy generowane przez 'TxAdviceBeanDefinitionParser' sprawdza element docelowy dla adnotacji przy wywołaniu. – skaffman

+0

Okazuje się, że moje założenie o dwóch utworzonych TransactionInterceptors jest prawdziwe. Zadałem pytanie (w tym moje nowe wyniki) na forum wiosennym i będę na bieżąco informować o wyniku. – Bozho

Powiązane problemy