2012-02-10 8 views
3

이해 I 가정 자바 호출과 다음 스택 트레이스 :자바 봄 : @Transactional rollbackFor 및 트랜잭션 경계

B.method2 (annotated with a plain @Transactional) 
A.method1 (annotated with a plain @Transactional) 
Main.main (starting point of the call, with no current transaction) 

내가 A.method1를 입력 할 때 트랜잭션이 시작되는 것으로 예상 - 트랜잭션이 커밋 될 것이다 (또는 롤백) A.method1 남아있을 때. 나는 또한 B.method2 내에서 동일한 거래가 사용될 것으로 기대한다.

RuntimeException은 B.method2에서 발생합니다. 이것은 RollbackFor에 대해 기본적으로 '나열된'예외입니다. 예외는 A.method1 내에서 catch되지만 B.method2를 벗어날 때 @Transactional의 경계를 전달합니다.

이것은 내 질문입니다. (현재) 트랜잭션이 롤백으로 표시 될 것인가 아닌가?

+0

누군가가 대답 할 때까지 기다리는 것이 아니라 빨리 시도해 주시겠습니까? – skaffman

+0

실제 아니요 - 다양한 설정 (AOP, AspectJ,로드 타임/에이전트 짜기 ...)으로 Spring을 구성 할 수 있기 때문입니다. 이것은 @Transactional의 개념에 대한 질문입니다. – aanno

답변

0

기본 전파 모드는 REQUIRED이고 method2는 method1에 대해 시작된 트랜잭션을 사용합니다. 예외적으로이 트랜잭션은 롤백으로 표시되므로 아무 것도 데이터베이스에 커밋되지 않습니다. method1 다음에 UnexpectedRollbackException이 표시 될 수 있습니다.

트랜잭션을 시작한 코드 (소유하고있는 코드)가 롤백/커밋을 제어해야하므로 바람직한 동작이 아닙니다. 이러한 가능성을 피하기 위해 코드를 재구성 할 것입니다.

+0

예, 이것은 내가 그것을 시도 할 때 얻는 것이며, 또한 스프링 소스 코드를 읽을 때 무엇을 보게되는지. 그러나 IMHO, 그것은 이상하게 느낀다. 사실, 내가 예상 한 것은 예외가 트랜잭션 경계를 넘었을 때만 트랜잭션이 롤백으로 표시된다는 것입니다. 이것은 나의 예에서는 그렇지 않다. (트랜잭션이 A.method1에서 시작되고 끝남에 따라) - 따라서 트랜잭션이 롤백을 위해 표시되지 않았다. – aanno

+0

BTW는 JEE 6의 선언적 트랜잭션 관리와 함께이 처리 방식을 사용합니까? – aanno

+0

@aanno 그러면 귀하의 질문은 무엇입니까? 설명 된 시나리오에는 하나의 트랜잭션 만 있습니다. 롤백 표시된 경우 롤백됩니다. 나는 JPA를 사용하지 않았다. 다른 질문을하고 싶을 수도있다. – mrembisz

관련 문제