트랜젝션 : 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
- 전부 성공하든가 전부 실패하든가(All or Nothing)
ACID 원칙
- 원자성(Atomicity) : 더이상 쪼갤 수 없음. 논리적으로 하나의 작업으로 인식해서 둘 다 성공하든가 둘 다 실패하든가**(All or Nothing)**
- 일관성(Consistency) : 비즈니스 로직에서 의도하는 대로 일관성 있게 동작
- 격리성(Isolation) : 여러개의 트랜젝션은 각각 독립적으로 실행. 즉 다른 트랜젝션에 영향을 주지 않아야함
- 지속성(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)
: 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할때(존재하지 않을떄) 어떻게 동잘할 것인지 결정하는 방식
- propagation = Propagation.REQUIRED : (default) 현재 진행 중인 트랜잭션이 존재하면 해당 트랜잭션을 사용하고, 존재하지 않으면 새 트랜잭션을 생성
- Propagation.REQUIRES_NEW : 이미 진행 중인 트랜젝션과 무관하게 새로운 트랜젝션 시작. 기존에 진행중이던 트랜젝션은 새로 시작된 트랜젝션이 종료할 때까지 중지
- Propagation.MANDATORY : 진행 중인 트랜젝션이 없으면 에외를 발생시킴
- Propagation.NOT_SUPPORTED : 트랜젝션을 필요로 하지 않음. 진행 중인 트랜젝션이 있으면 메서드 실행이 종료될 때까지 진행 중인 트랜젝션은 중지되며, 메서드 실행이 종료되면 트랜젝션을 계속 진행함
- Propagation.NEVER : 트랜젝션을 필요로 하지 않음. 진행 중인 트랜젝션이 존재할 경우 예외를 발생시킴
트랜젝션 격리 레벨(Isolation Level)
- 다른 트랜잭션에 영향을 주지 않고 독립적으로 실행되어야 하는 레벨
- 격리단계가 높아질수록 성능이 떨어짐 (높아질수록 거의 스냅샷 수준이기 때문..)
- Isolation.DEFAULT : DB에서 제공하는 기본 값
- Isolation.READ_UNCOMMITTED : 다른 트랜젝션에서 커밋하지 않은 데이터를 읽는것을 허용(ex.오라클)
- Isolation.READ_COMMITTED : 다른 트랜젝션에 의해 커밋된 데이터를 읽는 것을 허용(ex.MySQL)
- Isolation.REPEATABLE_READ : 트랜젝션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 함
- Isolation.SERIALIZABLE : 동일한 데이터에 대해 동시에 두개 이상의 트랜젝션이 수행되지 못하도록 함
'Coding > Back - Spring Framework' 카테고리의 다른 글
Spring Testing 개념 1/3 #Day13 (0) | 2023.09.03 |
---|---|
(review2) Spring 구성하기(Controller - Serivce - Repository) #Day12 (0) | 2023.09.01 |
Spring Data JPA #Day10 (0) | 2023.08.31 |
Spring Persistence(DataAccess) Layer : JPA 예제(ORM : 엔티티 간 관계) 3/3 #Day9 (1) | 2023.08.30 |
Spring Persistence(DataAccess) Layer : JPA 예제 2/3 #Day9 (0) | 2023.08.30 |