Service class 단위의 트랜잭션 처리는 다음의 설정으로 가능합니다.
<!-- Transaction AOP -->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethods"
expression="execution(* *..*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
<!-- Transaction -->
여기서 트랜잭션 예외 처리를 하려면 메소드 명을 다음과 같이 해야 합니다.
<!-- Transaction -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="retrieve*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="print*" read-only="true" />
<tx:method name="start*" propagation="REQUIRES_NEW"/>
<tx:method name="finish*" propagation="REQUIRES_NEW"/>
<tx:method name="error*" propagation="REQUIRES_NEW"/>
<tx:method name="logging*" propagation="REQUIRES_NEW"/>
<tx:method name="*" propagation="REQUIRED" timeout="10000" />
</tx:attributes>
</tx:advice>
=> start, finish, error, logging 으로 시작되는 public 메소드명 사용
* 여기서 문제는 메인 메소드와 트랜잭션 예외 처리해야 하는 메소드는 다른 클래스에서 선언된 것이어야 합니다.
관련 자료입니다.
http://www.javablog.fr/spring-transaction-visibility-proxy-propagation-required-and-requires_new.html
몇가지 솔루션들이 있는데 참고하시기 바랍니다.
1. When using proxies, the @Transactional annotation should only be applied to methods with public visibility
2. This means that ‘self-invocation’, i.e. a method within the target object calling some other method of the target object
Comments
Post a Comment