Coding/Back - Spring Framework

Spring Transaction #Day11

꿀딴지- 2023. 9. 1. 15:12

트랜젝션 : 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위

  • 전부 성공하든가 전부 실패하든가(All or Nothing)

ACID 원칙

  1. 원자성(Atomicity) : 더이상 쪼갤 수 없음. 논리적으로 하나의 작업으로 인식해서 둘 다 성공하든가 둘 다 실패하든가**(All or Nothing)**
  2. 일관성(Consistency) : 비즈니스 로직에서 의도하는 대로 일관성 있게 동작
  3. 격리성(Isolation) : 여러개의 트랜젝션은 각각 독립적으로 실행. 즉 다른 트랜젝션에 영향을 주지 않아야함
  4. 지속성(Durability) : 트랜젝션이 완료되면 그 결과는 지속되어야 함

커밋(commit)과 롤백(rollback)

  • 커밋(=반영한다) : 하나의 트랜젝션 종료
  • 롤백 : 트랜젝션 내에서 수행된 작업 취소

 

Spring 에서의 Transaction

에너테이션 방식, AOP 방식(관심사 분리, 공통영역 따로 처리)

<에너테이션 방식>

@Transactional (클래스 앞, 메서드 앞)

  • 체크 예외(checked exception) 롤백
    • catch 처리
    • @Transactional(rollbackFor = {SQLException.class, DataFormatException.class})체크 예외를 직접 지정
    • 언체크 예외(unchecked exception)로 감싸서 rollback이 동작

@Transactional(readOnly = true) 조회할때 사용(JPA 자체 성능 최적화)

  • commit은 하지만 JPA 내부적으로 영속성 컨텍스트를 flush 하지 않음
  • 변경감지를 위한 스냅샷 생성도 하지 않음

@Transactional(propagation = Propagation.REQUIRED)

  • 현재 진행 중인 트랜잭션이 존재하면 해당 트랜잭션을 사용하고, 존재하지 않으면 새 트랜잭션을 생성

트랜젝션 적용 순서

  • 클래스 레벨에만 적용된경우 - 메서드에 일괄 적용됨
  • 클레스 + 메서드 - 메서드 레벨에서 적용, 메서드 레벨에 없으면 클래스 레벨 적용됨

 

 

전파 : 트랜잭션 간 영향관계

격리 수준 : 트랜잭션 에서 사용되는 값들의 문제

 

트랜잭션 전파(Transaction Propagation)

: 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할때(존재하지 않을떄) 어떻게 동잘할 것인지 결정하는 방식

  1. propagation = Propagation.REQUIRED : (default) 현재 진행 중인 트랜잭션이 존재하면 해당 트랜잭션을 사용하고, 존재하지 않으면 새 트랜잭션을 생성
  2. Propagation.REQUIRES_NEW : 이미 진행 중인 트랜젝션과 무관하게 새로운 트랜젝션 시작. 기존에 진행중이던 트랜젝션은 새로 시작된 트랜젝션이 종료할 때까지 중지
  3. Propagation.MANDATORY : 진행 중인 트랜젝션이 없으면 에외를 발생시킴
  4. Propagation.NOT_SUPPORTED : 트랜젝션을 필요로 하지 않음. 진행 중인 트랜젝션이 있으면 메서드 실행이 종료될 때까지 진행 중인 트랜젝션은 중지되며, 메서드 실행이 종료되면 트랜젝션을 계속 진행함
  5. Propagation.NEVER : 트랜젝션을 필요로 하지 않음. 진행 중인 트랜젝션이 존재할 경우 예외를 발생시킴

트랜젝션 격리 레벨(Isolation Level)

  • 다른 트랜잭션에 영향을 주지 않고 독립적으로 실행되어야 하는 레벨
  • 격리단계가 높아질수록 성능이 떨어짐 (높아질수록 거의 스냅샷 수준이기 때문..)
  1. Isolation.DEFAULT : DB에서 제공하는 기본 값
  2. Isolation.READ_UNCOMMITTED : 다른 트랜젝션에서 커밋하지 않은 데이터를 읽는것을 허용(ex.오라클)
  3. Isolation.READ_COMMITTED : 다른 트랜젝션에 의해 커밋된 데이터를 읽는 것을 허용(ex.MySQL)
  4. Isolation.REPEATABLE_READ : 트랜젝션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 함
  5. Isolation.SERIALIZABLE : 동일한 데이터에 대해 동시에 두개 이상의 트랜젝션이 수행되지 못하도록 함