1

우리는 지속성 솔루션으로서 Hibernate를 사용하여 Spring MVC에서 새로운 애플리케이션을 빌드하고있다. 데이터 영역에 접근하는 솔루션은 두 가지가 있습니다.봄에 중첩 된 트랜잭션

1) 경우에 따라 컨트롤러가 DAO 레이어를 직접 호출합니다. 비즈니스 점검을 수행 할 필요가 없기 때문에이 작업이 수행됩니다. 따라서 우리는 이러한 경우를 위해 서비스 레이어를 우회합니다. 이를 위해 서비스 레이어를 구현하는 것은 DAO 레이어에 메소드를 위임하는 것에서 나타납니다.

다음과 같이 처리합니다. 컨트롤러 -> DAO

2) 기타 경우에는 업무상 확인이 필요합니다. 이를 위해 우리는 일반적인 방법을 사용합니다 :
컨트롤러 -> 서비스 -> DAO

봄에서는 우리는 트랜잭션을 구분할 필요가 있으므로 모든 DAO 메소드에 @Transaction 주석을 붙입니다. 이 컨트롤러 -> DAO 방식으로 잘 작동합니다. 그러나 컨트롤러 -> 서비스 -> DAO 방식을 수행하는 경우 서비스 메소드에 @Transaction 주석을 추가해야합니다.

이것은 중첩 된 트랜잭션이있는 경우가 있음을 의미합니다. 좋은 접근 방법입니까? 모든 DAO 방법에 대해 새 트랜잭션 (REQUIRES_NEW)을 만들거나 기존 트랜잭션 (REQUIRED)이 있으면 필요합니까?

누군가 내게 이것을 밝힐 수 있습니까?

답변

3

기본 전파 전략 (REQUIRED)은 대부분의 시나리오에서 합리적인 선택이므로 매우 특별한 요구 사항이없는 한 안전하게 사용할 수 있습니다.

두 번째 경우 REQUIRED은 DAO 방법에 @Transactional이없는 것과 거의 같은 방식으로 작동합니다. 유일한 차이점은 rollback-on-exception 동작입니다. 예외 (트랜잭션 롤백을 유발하는 예외)가 최상위 레벨이 아닌 트랜잭션 방식의 경계를 통과 할 때 트랜잭션은 "롤백 전용"으로 표시되므로 DAO 메소드에서 던져진 롤백을 유발하는 예외를 잡아서 트랜잭션을 커밋 할 수 없습니다.

REQUIRES_NEW은 내부 트랜잭션과 외부 트랜잭션을 개별적으로 롤백 할 수 있도록하려는 경우에만 필요합니다.

관련 문제