2013-09-05 2 views
3

나는 @Service이라는 주석이 달린 클래스가 있습니다. 두 가지 다른 데이터 소스 (데이터베이스 및 컨텐츠 저장소)를 업데이트해야하는 메소드가 있습니다. 서비스 클래스의 메소드에 @Transactional을 추가했습니다. 더 이상 사용자 정의하지 않고; 동일한 트랜잭션 내에서 두 개의 저장소 클래스 (@Repository으로 주석 됨)가 실행되는 것이 맞습니까?스프링에서 @Transactional의 올바른 사용

나는 보스 7.1.1를 사용하고 난 봄에 (3.2) 설정이 두 라인을 가지고 :

<tx:jta-transaction-manager/> 
<tx:annotation-driven proxy-target-class="true"/> 

또는 두 개의 서로 다른 트랜잭션이 실행합니까? 서비스 계층 메서드 내에서 런타임 예외가 throw되지 않을 때만 데이터를 커밋하려고합니다. 컨트롤러 메서드 (@Controller로 주석 된 클래스)에서 호출됩니다.

Jackrabbit과 데이터베이스 연결을 동일한 트랜잭션으로 실행하는 데 도움이되는 사람에게 최대한 빨리 500 bounty를 추가 할 것입니다. JBoss 7.1.1, Spring 3.2, Jackrabbit 2.6.2 JCA를 사용하고 있습니다.

+0

스프링이 jndi에서 필요한 빈을 가져 오기 때문에 구성이 충분해야하지만 JTA는 대개 PITA입니다. JTA 트랜잭션은 복구하기 쉽지 않으며 트랜잭션 관리자와 데이터베이스에서 부분 트랜잭션을 삭제하기 위해 일부 수동 작업을 수행해야 할 수도 있기 때문에 데이터 소스와 앱 충돌로 부분적인 오류를 테스트하는 것이 좋습니다. – Augusto

답변

0

더 이상 사용자 정의하지 않으면 두 저장소 클래스가 다른 트랜잭션에서 실행됩니다.

당신이 찾고있는 Distributed Transaction, 그 herehere에 대한 StackOverflow 답변이 있습니다. Java EE 서버에서 실행하지 않는 경우 Tomcat과 같은 일반 서블릿 컨테이너에 대한 분산 트랜잭션 설정을 설명하는 article이 있습니다.