Spring - @Transactional의 속성들 중 propagation

김도형·2022년 10월 24일
0
post-thumbnail

@Transactional 의 속성들(3가지)

  • propagation
  • isolation
  • readOnly
  • rollbackFor
  • noRollbackFor
  • timeout

propagation

  • Tx의 경계(boundary)를 설정하는 방법을 지정

propagation의 속성값

  • REQUIRED : Tx 기존에 있으면 새로 Tx 안 만듬.(디폴트)
  • REQUIRES_NEW : Tx이 진행 중이건 아니건, 새로 Tx 시작
  • NESTED : Tx이 진행 중이면, Tx의 내부 Tx로 실행

REQUIRED

  • B2에서 rollback 하면 Tx1 시작
  • A2에서 rollback 하면 Tx1 시작

REQUIRES_NEW

  • B2에서 rollback 하면 Tx2 시작 -> rollback 하기 전 A1 성공 후 rollabck 후 A1 취소
  • A2에서 rollback 하면 Tx1 시작 -> B1,B2 성공해서 commit

같은 클래스 내의 다른 Tx 메서드 호출 시 주의 사항

같은 클래스 내의 메서드를 내부 호출을 한다면, Advice가 적용되지 않아(즉, TransactionManager가 적용 안됨) 서로 다른 Tx로 인식해서 같은 Tx 내에서 작동 안됨.

public class TxService {
    @Autowired A1Dao a1Dao;
    @Autowired B1Dao b1Dao;

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void insertA1WithTx() throws Exception {
        a1Dao.insert(1, 100); // 성공
        insertB1WithTx(); // 클래스 내의 내부 호출 
        a1Dao.insert(1, 100); // 실패
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void insertB1WithTx() throws Exception {
        b1Dao.insert(1, 100); // 성공
        b1Dao.insert(2, 200); // 성공
    }

해결 방법은 2가지로

  • 직접 Tx 경계 설정
  • 두 메서드를 별도의 클래스 분리

출처 : 남궁성 저자의 스프링의 정석 패스트 캠퍼스

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글