@Transactional
메서드나 클래스에 적용되어 해당 메서드나 클래스에서 수행되는 모든 작업을 하나의 트랜잭션으로 묶어주는 역할
해당 메서드나 클래스에서 수행된 작업 중 어떤 하나라도 실패하는 경우, 모든 작업이 취소되어 데이터 일관성이 유지된다.
Transaction ACID
1) 원자성 (Atomicity)
- 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리
- 모두 성공하거나 모두 실패
2) 일관성 (Consistency)
- 트랜잭션은 일관성 있는 데이터베이스 상태를 유지
3) 격리성 (Isolation)
- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리
4) 영속성 (Durability)
- 트랜잭션을 성공적으로 마치면 결과가 항상 저장
@ 애너테이션 속성
* 접근제어자가 private / protected 일 경우 @Transactional을 무시한다.
1. Isolation Level
@Transactional( isolation = Isolation.XX )
트랙잭션에서 일관성없는 데이터 허용 수준을 설정
1) DEFAULT
- DBMS의 기본 격리 수준 적용
2) READ_UNCOMMITED (level0)
- 트랜잭션의 동시 액세스 허용
- Postgres는 미지원, Oracle은 지원하거나 허용하지 않음
- 세가지 동시성 부작용이 모두 발생
=> Dirty read, Non repeatable read, Phamtom read
* Dirty read란, 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있는 현상 (데이터 불일치)
* Non-repeatable read란, 동일한 트랜잭션 내에서 같은 쿼리를 두번 이상 실행할 때 결과 값이 다른 현상
* Phamtom read란, 동일한 쿼리를 실행할 때 결과 값이 다른 현상
3) READ_COMMITED (level1)
- Dirty read 방지
- Postgres, SQL, Server 및 Oracle의 기본 수준
- 동시성 부작용 여전히 발생
=> Non repeatable read, Phamtom read
4) REPEATABLE_READ (level2)
- Dirty read, Non repeatable read 방지
- 업데이트 손실을 방지하기 위해 필요한 가장 낮은 수준 (동시 액세스 허용하지 않음)
- 동시성 부작용 여전히 발생
=> Phamtom read
- MySQL의 기본 수준, Oracle은 미지원
5) SERIALIZABLE (level3)
- 가장 높은 격리 수준이지만, 동시 호출을 순차적으로 실행하므로 성능 저하의 우려
- 모든 부작용을 방지
2. Propagation
@Transactional( propagation = Propagation.XX )
동작 도중 다른 트랜잭션을 호출할 때 어떻게 할 것인지 지정하는 옵션
1) REQUIRED (default)
- 활성 트랜잭션이 있는지 확인하고, 아무것도 없으면 새 트랜잭션을 생성
2) SUPPORTS
- 활성 트랜잭션이 있는지 확인하고, 있으면 기존 트랜잭션 사용 없으면 트랜잭션 없이 실행
3) REQUIRED_NEW
- 현재 트랜잭션이 존재하는 경우, 현재 트랜잭션을 일시 중단하고 새 트랜잭션 생성
4) MANDATORY
- 활성 트랜잭션이 있으면 사용하고 없으면 예외발생
- 독립적으로 트랜잭션을 진행하면 안되는 경우 사용
5) NOT_SUPPORTED
- 현재 트랜잭션이 존재하면 트랜잭션을 일시 중단한 다음 트랜잭션없이 비즈니스 로직 실행
6) NAVER
- 활성 트랜잭션이 있으면 예외 발생
- 트랜잭션을 사용하지 않도록 제어할 경우
7) NESTED
- 트랜잭션이 존재하는지 확인하고 존재하는 경우 저장점을 표시
- 비즈니스 로직 실행에서 예외가 발생하면 트랜잭션이 이 저장 지점으로 롤백
- 활성 트랜잭션이 없으면 REQUIRED_NEW 처럼 작동
3. Timeout
@Transactional( timeout = 10 )
지정한 시간 내에 메서드 수행이 완료되지 않으면 rollback되도록 설정
단위 : second
-1일 경우 no timeout (default : -1)
4. ReadOnly
@Transactional( readOnly = true )
트랜잭션을 읽기 전용으로 설정
readOnly = true인 경우 INSERT UPDATE DELETE 작업 진행 시 예외 발생
default : false
5. Rollback
선언적 트랜잭션에서는 런타임 예외가 발생하면 롤백 수행
예외가 발생하지 않거나 체크 예외 발생시 커밋
rollbackFor옵션으로 기본 동작방식 변경 가능
1) noRollbackFor
@Transactional( rollbackFor = Exception.class )
- 특정 예외 발생 시 rollback이 동작하지 않도록 설정
2) rollbackFor
@Transactional( noRollbackFor = Exception.class )
- 특정 예외 발생 시 rollback이 동작하도록 설정
'Java' 카테고리의 다른 글
[Spring] DAO, DTO, VO, Record 개념 및 차이점 (0) | 2023.04.17 |
---|---|
[Spring] Controller Request 값 @valid 이용하여 검증하기 (2) | 2023.04.16 |
CI/CD란? 지속적 통합, 지속적 제공(배포) (0) | 2021.09.01 |
[Spring Boot] /index.html 파일 static 폴더가 아닌 templates 폴더에서 호출되게 하는 방법 (0) | 2021.06.24 |
[Spring Boot] SpringBootServletInitializer 상속하는 이유 (0) | 2021.06.24 |