2011-08-26 4 views
1

Spring + Struts + Hibernate 설정에서 선언적 트랜잭션 관리를 구현하려고합니다. 이것은 내가 내 FooService 클래스에서 두 개의 공용 메서드를 정의트랜잭션이 Spring 선언적 트랜잭션 모드에서 작동하지 않는 것 같습니다.

<property> 
    <props> 
    <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop> 
    </props> 
</property> 

내 applicationcontext.xml의 일부입니다 -> UpdateFoo, foodooTest 및 (업데이트 논리가) 두 개인 방법 -> Test1을하고 Test2를

호출은 같이 간다 :

UpdateFoo->foodooTest->Test1 
        ->Test2 

(foodooTest 트랜잭션을 유발한다) 을 나는 콩을 만들

FooService fooService = (FooService)context.getBean("fooService"); 
//and call 
fooService.UpdateFoo(); 

Test2는 FooException을 throw하므로 트랜잭션이 롤백 될 것으로 예상됩니다. 그러나 그렇지 않습니다. 커밋은 각 Test1과 Test2에서 발생합니다 (예외가 발생할 때까지). 업데이트를 위해 최대 절전 모드 getHibernateTemplate.Merge()를 사용합니다. 내 db 엔진은 InnoDB입니다.

여기에 무엇이 누락되어 있는지 잘 모르겠습니다.

+0

당신은 관련성 suff를 게시해야한다. – Ralph

답변

1

사용자 정의 예외가 RuntimeException까지 확장되는 경우에만 Spring은 트랜잭션을 롤백합니다. 확인 FooExceptionRuntimeException (reference)를 확장합니다

기본 구성에서

는 Spring 프레임 워크의 트랜잭션 인프라 코드는 런타임의 경우 롤백 트랜잭션을 표시, 체크되지 않은 예외; 즉, Throw 된 예외가 RuntimeException의 인스턴스 또는 서브 클래스 일 때 (오류는 또한 기본적으로 롤백이됩니다). 트랜잭션 방식에서 발생하는 확인 된 예외는 기본 구성에서 롤백되지 않습니다.

귀하의 의견을 바탕으로 다음 두 가지 사항을 확인하십시오. 1) 플랫폼 트랜잭션 관리자가 구성되어 있는지 확인하십시오. 예 : 트랜잭션에 대한 주석을 사용하려면

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mySessionFactory" /> 
</bean> 

는 또한, 당신도 그 config (설정) 할 필요가 : 봄 구성 및 트랜잭션을 트리거하는 방법 :

<tx:annotation-driven /> 
+0

좋아, 내 문제는 정말 롤백 (나는 그것이 제어에 있다고 생각하지 않습니다). 내 문제는 내가 가서 FooException을 던지기 전에 Test1과 Test2 (DB에서 볼 수 있음)에서 발생합니다. –

+0

예, 구성되었습니다. 또한 'UpdateFoo'를 응용 프로그램 구성에 추가하면 트랜잭션이 예상대로 작동합니다. (두 경우 모두 Struts 액션에서 UpdateFoo에 대한 호출을하고 있습니다.) –

+0

즉, 테스트에 사용중인 Spring 설정이 앱의 Spring 설정과 일치하지 않는다는 것을 의미합니다. 가능한 한 최선을 다합니다. – atrain

관련 문제