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

23.08.23 11:48 작성 23.08.23 12:14 수정 조회수 167

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 인턴

2023.08.24

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

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

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

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

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

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