2013-02-13 4 views
0

Spring AOP를 사용하여 트랜잭션이되도록 구성된 Spring + Hibernate 프로젝트가있다.

일반 Spring + Hibernate 트랜잭션 동작?

DAO 방법을 TransactionSynchronizationManager.isActualTransactionActive()으로 체크인하면 true로 표시됩니다.

내 서비스 클래스에서 두 DAO 메서드를 호출하고 있는데 두 번째 DAO 메서드에서는 'devide by zero'을 의도적으로 오류를 throw하고 두 메서드가 롤백되는지 확인합니다.

현재 첫 번째 레코드는 새 레코드를 삽입하는 것 같습니다. 첫 번째 방법
을 롤백하면 안됩니까?

업데이트 내 이전 질문을 참조 할 수 있지만 너무 길 수 있습니다.


Transaction Management in Spring 3.x and Hibernate 4


는, (내가 할 수있는만큼) 질문을 요약하면
나는 DAO 클래스에서이 메소드를 호출 한 서비스 클래스의 방법이있다.
해당 서비스 클래스가 spring mvc 컨트롤러 및 해당 대리자에서 호출되고 있습니다.

내 AOP있어

:


내 인터페이스 Crudable이

public interface Crudable { 

    public int delete(CooingbeeFetchable bean); 
    public int save(CooingbeeFetchable bean); 
    public int update(CooingbeeFetchable bean); 
    public Set<CooingbeeFetchable> list(CooingbeeFetchable bean); 
    public CooingbeeFetchable get(int id); 
    public int count(CooingbeeFetchable bean); 
    public int save2(CooingbeeFetchable bean); 
} 


DAO 및 서비스 클래스 모두 같습니다

<aop:config proxy-target-class="true"> 
    <aop:pointcut id="transactionalServiceOperation" expression="execution(* kr.co.sgis.services.web.cooingbee.Crudable.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalServiceOperation"/> 
</aop:config> 
을 다음과 같이 설정을 Cruadable를 구현 인터페이스. 이제 예상대로 작동하지 않는 이유가 일까요?
희망이 너무 길지 않아 충분한 정보를 제공해 주셨습니다.)

답변

0

나는 그것을 결국 알아 냈습니다.
읽어보기.
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back

문서는 봄이 롤백 할 수 있도록 뭔가가 DAO 방식에 잘못 알고에 대한 예외를 던질 필요가 말한다. 이전에는 내 DAO 메서드가 예외를 throw하지 않았고 대신 try body 블록의 메서드 본문을 둘러싼 예외를 처리했습니다.

또한 aop : config 태그를 이와 같이 구성해야합니다.

<aop:config proxy-target-class="true"> 
    <aop:pointcut id="transactionalServiceOperation" expression="execution(* kr.co.sgis.services.web.cooingbee.Crudable.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalServiceOperation"/> 
</aop:config> 

이 정보가 도움이되기를 바랍니다. :)
건배

0

두 방법 모두 트랜잭션 방식 인 경우 자연스럽게 두 번째 방법이 실패하면 첫 번째 방법에 영향을 미치지 않습니다. 두 방법 모두 단일 (올바른) 트랜잭션의 일부라고 생각하면 부분적으로 커밋 한 것 또는 사실에 대해 오인됩니다. 왜 다른 하나가 사실인지에 대해 좋은 답변을 얻으려면 더 많은 정보를 제공해야합니다.

관련 문제