인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

선한영향력주는개발자되기님의 프로필 이미지
선한영향력주는개발자되기

작성한 질문수

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

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

작성

·

317

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);
    }

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

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

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

감사합니다.

선한영향력주는개발자되기님의 프로필 이미지
선한영향력주는개발자되기

작성한 질문수

질문하기