Spring 에서의 트랜잭션

ON&OFF·2023년 8월 31일
0

스프링 정리

목록 보기
5/7

1. 어노테이션

@Transactional - 트랜잭션화 시키기 위해 사용하는 어노테이션
@EnableTransactionManagement - 트랜잭션 어노테이션을 사용하기위해 꼭 붙여주어야 한다.

  • 클래스, 메서드 위에 어노테이션을 추가하면 된다.
  • 트랜잭션 기능이 적용된 프록시 객체가 생성된다.

2. 트랜잭션 세부설정

2.1 lsolation (격리 수준)

트랜잭션에서 일관성이 없는 데이터를 허용하는 수준

  • 일관성이 높아질수록 성능 저하가 생김.

사용법 -
@Transactional(isolation=lsolation.DEFAULT)

  • DEFAULT
  • READ_UNCOMMITTED (Dirty Read 발생)
    • 커밋되지 않은 데이터도 읽기를 허용
  • READ_COMMITTED (Dirty Read 방지)
    • 커밋이 확정된 데이터만 읽기를 허용
  • REPEATABLE_READ (Non-Repeatable Read 방지)
    • 트랜잭션이 완료될 때까지 다른 사용자는 읽기가 불가능
  • SERIALIZABLE (Phantom Read 방지) - 가장 빡빡한 단계

2.2 Propagation (전파 수준)

트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황

  • 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성값
  • REQUIRED
    • 디폴트 속성 (부모 트랜잭션 안에서 자식(내부) 트랜잭션까지 실행)
  • SUPPORTS
    • 이미 시작된 트랜잭션이 있으면 참여하고 없으면 트랜잭션이 없이 진행
  • REQUIRES_NEW
    • 부모 안에서 자식이 있어도 자식을 위한 트랜잭션을 새로 생성해서 동작
  • NESTED
    • 이미 진행중인 트랜잭션이 있는 경우 중첩 트랜잭션을 시작함
    • 중첩 트랜잭션은 먼저 시작된 부모 트랜잭션이 커밋되었는지에 대해선 영향을 받지만 안에 있는 중첩 트랜잭션이 커밋되었는지는 부모에게 영향을 주지 않는다
    • 사용 예시 - 일기 작성 관련해서 로그를 DB에 저장하는 상황
      로그 저장이 실패한다고 해서-> 일기 작성까지 롤백되면 안됨
      일기 작성이 실패한다면-> 로그 작성까지 롤백되어야 함

2.3 readOnly 속성

트랜잭션을 읽기 전용 속성으로 지정
읽기 전용으로 지정 시 성능이 향상됨.

  • @Transactional(readOnly=true)

2.4 트랜잭션 롤백 예외

예외 발생했을 때 트랜잭션 롤백시킬 경우를 설정

  • @Transactional(rollbackFor=Exception.class)
    • 익센션에 대해 롤백하고 싶을 때 사용
  • @Transactional(noRollbackFor=Exception.class)
    • 특정 익셉션은 그냥 롤백하지 않고 진행시키길 원할 때 사용
  • Default : RuntimeException, Error

2.5 Timeout 속성

일정 시간 내에 트랜잭션 끝내지 못하면 롤백

  • @Transactional(timeout=10)
profile
안 되면 될 때까지

0개의 댓글