230405 TIL #51 Spring에서 Transaction / @Transactional

김춘복·2023년 4월 4일
0

TIL : Today I Learned

목록 보기
51/571

230405 Today I Learned

실전 프로젝트 5일차. 오늘은 h2에서 mysql aws rds를 적용해서 jmeter로 테스트를 했다. 도중에 LockAcquisitionException이 발생해서 시간을 꽤 오래 잡아먹었지만 비관적lock으로 해결했다. 이 내용은 내일 TIL에 정리해보려 한다.


Spring에서 트랜잭션

  • Spring에서는 @Transactional로 트랜잭션을 메서드나 클래스에 구현.

@Transactional의 속성

isolation

: 격리수준을 설정

  • Default : 기본격리수준. 대부분의 DB에서는 READ_COMMITTED
  • READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 설정 가능.

readOnly

: 데이터를 읽기만 할 때 사용. 읽기 작업 최적화. 여기서 데이터 수정시 예외 발생

rollbackFor

@Transactional(rollbackFor = Exception.class) 처럼 특정 예외 발생시 롤백.

noRollbackFor

@Transactional(noRollbackFor = {IOException.class, TimeoutException.class}
지정한 예외들 발생시엔 롤백 안하도록 설정.

propagation

: @Transactional이 있는 메서드에서 이미 시작된 트랜잭션이 있을 경우 이 트랜잭션을 사용할지, 트랜잭션을 새로 시작할지 지정.

  • REQUIRED : 기본값. 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고, 없으면 새로 시작. 자식과 부모에서 롤백이 발생하면 전부 롤백
  • REQUIRES_NEW : 항상 새로운 트랜잭션을 시작. 이미 시작된 트랜잭션은 일시 중지.
  • SUPPORTS : 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고 없으면 트랜잭션 없이 실행
  • MANDATORY : 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용하고 없으면 예외를 던짐.
  • NOT_SUPPORTED : 트랜잭션 없이 실행. 이미 시작된 트랜잭션은 일시 중단.
  • NEVER : 트랜잭션 없이 실행. 이미 시작된 트랜잭션이 있으면 예외를 던짐.
  • NESTED : 부모 트랜잭션이 존재하면 부모 트랜잭션에 중첩. 없으면 새로 트랜잭션 생성.
    부모에 예외 발생시 자식 트랜잭션도 롤백. 하지만 자식에서 예외발생시 부모는 롤백X.
profile
Backend Dev / Data Engineer

0개의 댓글