inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 DB 2편 - 데이터 접근 활용 기술

내부 트랜잭션 REQUIRES_NEW 질문입니다.

383

선한영향력주는개발자되기

작성한 질문수 3

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요.

트랜잭션 전파 REQUIRES_NEW 강의를 들으면서 궁금한 점이 생겼습니다.

해당 옵션을 추가하면 커넥션을 새로 생성한다고 하셨는데

극단적인 상황이지만 만약 애플리케이션의 커넥션 풀이 10개인데 외부+내부 트랜잭션을 위해서 10개의 커넥션을 다 사용한다고 했을때 어떠한 이유로 마지막 커넥션에서 지연이 발생했고 다른스레드에서 커넥션 요청이 오면 커넥션풀에서 데드락이 발생할 수도 있을거 같아서 테스트를 해봤더니 예외가 발생했습니다.

이런 상황은 거의 발생하지 않겠지만 혹시 내부 트랜잭션 생성시 REQUIRES_NEW 옵션을 사용 할 때 트랜잭션의 갯수 제한 같은게 있는지 궁금합니다.

뒷부분 강의는 아직 듣지 않아서 해당 내용이 나왔을 수도 있지만 궁금해서 질문을 남겨봅니다.

아래는 극단적인 상황을 테스트해본 코드입니다.

    @Test
    void transaction_test() throws InterruptedException {
        log.info("외부 트랜잭션 시작");
        TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute());
        log.info("outer.isNewTransaction() = {}", outer.isNewTransaction());

        DefaultTransactionAttribute definition = new DefaultTransactionAttribute();
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus inner1 = txManager.getTransaction(definition);
        TransactionStatus inner2 = txManager.getTransaction(definition);
        TransactionStatus inner3 = txManager.getTransaction(definition);
        TransactionStatus inner4 = txManager.getTransaction(definition);
        TransactionStatus inner5 = txManager.getTransaction(definition);
        TransactionStatus inner6 = txManager.getTransaction(definition);
        TransactionStatus inner7 = txManager.getTransaction(definition);
        TransactionStatus inner8 = txManager.getTransaction(definition);
        TransactionStatus inner9 = txManager.getTransaction(definition);
        TransactionStatus inner10 = txManager.getTransaction(definition);

        Thread.sleep(5000);

        log.info("내부 트랜잭션 롤백");
        txManager.rollback(inner1);
        txManager.rollback(inner2);
        txManager.rollback(inner3);
        txManager.rollback(inner4);
        txManager.rollback(inner5);
        txManager.rollback(inner6);
        txManager.rollback(inner7);
        txManager.rollback(inner8);
        txManager.rollback(inner9);
        txManager.rollback(inner10);

        log.info("외부 트랜잭션 커밋");
        txManager.commit(outer);
    }

spring

답변 1

1

김영한

안녕하세요. 선한영향력주는개발자되기님

생각하신 내용이 맞습니다. 그래서 강의에서 설명드린 것 처럼 커넥션 수에 유의해서 사용해야 합니다.

감사합니다.

RepositoryTest의 패키지 위치가 domain인 이유

0

30

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

30

1

update()에 사용하는 setter 질문드립니다.

0

47

1

SQL 중심적 개발의 문제점에 대한 질문

0

72

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

84

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

174

1

@repository 어노테이션

0

89

3

ItemService

0

58

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

54

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

178

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

77

1

@EventListener(ApplicationReadyEvent.class) 관련

0

88

1

트랜잭션 동기화 매니저와 데이터 소스

0

76

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

94

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

112

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

83

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

72

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

102

1

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

0

98

2