스프링 트랜잭션 전파 - 분리

wangjh789·2022년 8월 22일
0

[Spring] 스프링-DB-2

목록 보기
20/21

트랜잭션의 REQUIRES_NEW 옵션을 사용한다.
별도의 물리 트랜잭션을 가진다는 뜻은 DB 커넥션을 따로 사용한다는 뜻이다.

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

        log.info("내부 트랜잭션 시작");
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus inner = txManager.getTransaction(definition);
        log.info("inner.isNewTransaction = {}", inner.isNewTransaction());

        log.info("내부 트랜잭션 롤백");
        txManager.rollback(inner);

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

Transaction 전파 수준을 Requires_new 로 설정하면 내부 트랜잭션 시작시 새로운 커넥션을 얻어 사용한다. (기존 값일 때에는 외부 트랜잭션에 참여했었다.)

내부 트랜잭션이 시작될때 외부 트랜잭션이 잠시 보류되고 내부 트랜잭션이 완료되어 커넥션이 종료되거나 커넥션 풀에 반납되었을 때 외부 트랜잭션이 다시 시작된다.

-> 이 상황은 쓰레드 하나가 커넥션을 2개 쓴다는 의미로 상황에 맞게 써야한다.

트랜잭션 전파 옵션
isolateion, timeout, readOnly 는 트랜잭션이 처음 시작될 때만 적용된다.

profile
기록

0개의 댓글