inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

트랜잭션 전파 속성 REQUIRES_NEW 관련 질문

323

lim3617

작성한 질문수 7

0

안녕하세요 트랜잭션 관련해서 질문이 있어서 글을 남깁니다.

트랜잭션매니저 2개(Jpatxmanager, datasourcetxamanger)를 만들어서 테스트 중입니다. 1개는 전반적인 일반 비지니스 로직에 적용되는 트랜잭션 매니저이고, 다른 1개는 API 호출시 관련 데이터를 DB에 저장하는 로직에 사용되는 트랜잭션 매니저입니다.

파일에 다음과 같이 선언 되어있습니다.

//로그 저장 하는 메소드 호출시 관리하는 트랜잭션매니저

<bean id="logTxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="egov.dataSource"/>

</bean>

<tx:advice id="logTxAdvice" transaction-manager="logTxManager">

<tx:attributes>

<tx:method name="*" propagation="REQUIRES_NEW" rollback-for="Exception"/>

</tx:attributes>

</tx:advice>

... aop config 생략

//JPA트랜잭션매니저를 커스터마이징 한 트랜잭션매니저

<bean id="nbpmTxManager" class="com.nkia.itg.nbpm.common.NbpmTransactionManager" />

<tx:advice id="nbpmTxAdvice" transaction-manager="nbpmTxManager">

<tx:attributes>

<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />

</tx:attributes>

</tx:advice>

실행 순서는 다음과 같습니다.

1. A라는 비지니스 로직이 실행된다(A 트랜잭션매니저, 트랜잭션 전파 : REQUIRES)

2. B라는 로직(API 관련 데이터 저장)이 실행된다(B 트랜잭션매니저, 트랜잭션 전파 : REQUIRES_NEW)

제가 기대한 바로는 API 데이터 저장 메소드가 호출되면 새로운 db 커넥션을 획득해서 별도의 트랜잭션으로 관리 되는 것이었는데, 테스트를 해보니까 같은 커넥션을 공유하는것같습니다. A라는 비지니스 로직이 실패해서 예외가 발생해도 API관련 데이터 저장 로직에 영향을 주지 않기 위해서 별도로 분리하려고합니다.

제가 한 테스트 결과는, A 비지니스 로직(특정 테이블에 데이터 INSERT) 호출 하고 B라는 비지니스 로직(API 데이터 INSERT) 호출 후 B 메소드가 종료되고 COMMIT을 하면 A 로직에서 INSERT한 데이터도 COMMIT이 됩니다. 즉, REQUIRES_NEW 전파속성이 실행되지않는것같습니다.

예시)

finally {

B();

}

원인은 도저히 모르겠습니다 .. 답변 부탁드립니다.

자바 스프링 트랜잭션 전자정부표준프레임워크

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용은 트랜잭션 전파 속성인 REQUIRES_NEW에 대한 관련된 내용입니다. REQUIRES_NEW는 새로운 트랜잭션을 시작하고, 기존의 트랜잭션이 있는 경우에는 일시적으로 보류시키고 새로운 트랜잭션을 실행합니다.

코드를 살펴보면 logTxManager와 nbpmTxManager라는 두 개의 트랜잭션 매니저를 생성하고 있습니다. logTxManager는 로그를 저장하는 메소드 호출 시 사용되는 트랜잭션 매니저이고, nbpmTxManager는 API 호출 시 데이터를 DB에 저장하는 로직에서 사용되는 트랜잭션 매니저입니다.

logTxAdvice와 nbpmTxAdvice 태그는 두 개의 트랜잭션 매니저에 대한 어드바이스를 설정하는 부분입니다. REQUIRES_NEW 전파 속성을 사용하여 새로운 트랜잭션을 시작하도록 설정되어 있습니다. 이 설정은 해당 메소드가 실행될 때 새로운 트랜잭션을 시작하고, 기존의 트랜잭션을 일시적으로 보류하여 실행합니다.

실제 실행 순서는 코드에 더 이어져야 하지만, 1. A라는 작업을 수행하는 메소드에서 logTxAdvice에 설정된 REQUIRES_NEW 속성을 사용하여 새로운 트랜잭션을 시작하고, 2. B라는 작업을 수행하는 메소드에서는 nbpmTxAdvice에 설정된 REQUIRED 속성을 사용하여 이미 존재하는 트랜잭션을 참여시킵니다. 이렇게 함으로써, 각각의 메소드는 독립적인 트랜잭션으로 실행되면서 원하는 동작을 수행할 수 있습니다.

더 자세한 내용이 필요하시다면, 트랜잭션 관련 문서나 공식 문서, 레퍼런스 문서를 참고하시길 권장드립니다.

트랜잭션 전파 기본 - UnexpectRollbackException 관련 질문

0

135

2

[ScannerWhileEx4] input.nextLine(); 질문

1

162

1

예제코드 자바입니다

1

186

1

스프링 AOP 프록시에 대한 질문

0

128

1

로그인 기능 구현 (Application Layer 실습) 에서의 질문

1

165

2

step-in-muti-thread 질문

0

117

1

readonly 트랜잭션에 update를 수행하는 분리된 트랜잭션 메서드를 호출 할 때 질문

0

187

2

주문 조회 최적화 테스트 중 트랜잭션에 관하여 질문

0

239

1

스트림 질문 있습니다.

1

695

1

DatasourceManager와 JpaTransactionManager 혼용

0

565

2

@Transactional 안에서 외부 서비스 api call 관련 질문있습니다.

0

695

1

JPA페이징 공부를 하다가 궁금한점이 있습니다.

0

4151

1

실무에서도 예제처럼 익셉션을 내도 되는지 궁금합니다.

0

409

1

강의의 롤백 커밋 기준에 대해 추가로 궁금한 점이 있습니다.

0

565

1

트랜잭션에 관한 질문드립니다!

0

437

1

List, Map으로 응답 시의 메시지 컨버터

0

310

1

채팅관련 질문입니다

1

416

0

트랜잭션 전파 시 체크 예외를 활용한 복구 처리 관련 문의

3

645

1

프로젝트에 대해서

0

440

1

산 넘어 산 ㅠ java -jar 무반응 에러

0

994

1

안녕하세요 객체오류와 필드 오류에 대해서 질문이 있습니다.

1

437

1

스프링입문하는데 좋은 책이있을까요?

0

5001

1

스프링 레거시를 다뤄야 할 일이 생겼는데 영한님 강의중에 해당부분을 다루는 강의가 있을까요?

0

387

1

hibernate:drop table member if exists 오류

0

500

1