Spring에서 Transaction 처리
- ACID에 대한 설정
- 설정은 config 파일, xml, 애너테이션 등으로 가능하다.
- 일반적으로 애너테이션을 많이 사용하는데, @Transactional 사용시 프록시 객체를 생성하고 적용된 부분에 사용된다. PlatformTransactionManager 를 사용하여 트랜잭션을 시작하고 정상 여부에 따라 커밋/롤백이 수행된다.
(AOP 구조와 같음 -> 설정된 메서드나 클래스 전/후에 동작)
- private, protected는 무시한다.
설정
- Propagation Type : propagation(동작 도중 다른 트랜잭션 호출시 처리할 내용)
- Isolation Level : isolation(일관성없는 데이터 허용 수준)
- Timeout : timeout(지정한 시간내에 메서드가 종료되지 않으면 rollbcak 처리)
- readOnly flag : readOnly(트랜잭션을 읽기 전용으로 설정)
- Rollback Rules : noRollbackFor(특정 예외 발생시 롤백없음), rollbackFor(특정 예외 발생시 롤백처리)
1. Isolation Level
- 격리성에 대한 설정
- Phantom Read, Non-Repeatable Read, Dirty Read 방지 목적
- @Transactional(isolation = Isolation.설정)
설정
- Default : 사용하고 있는 DBMS의 기본 격리 수준으로 자동 설정되어 있음.
- READ_UNCOMMITTED : 모든 부작용 발생 가능
- READ_COMMITTED : Dirty Read 방지
- REPEATABLE_READ : Dirty Read, Non-Repeatable Read 방지
- SERIALIZABLE : 모든 부작용 방지, 성능 저하 우려
2. Propagation
- 트랜잭션 전파에 대한 설정
- 기본적으로 Spring에서는 트랜잭션 처리를 스레드 바운드(스레드마다 트랜잭션 바인딩)방식으로 처리한다. 다른 스레드가 사용중인 트랜잭션과 상호작용을 하기 위해서는 JTA를 통해 분산트랜잭션 처리를 해줘야 함.
- 이미 실행중인 트랜잭션 : 한 스레드 내의 이미 생성된 트랜잭션
- @Transactional(propagation = Propagation.설정)
- DEFAULT : REQUIRED
- REQUIRED : 이미 실행 중인 트랜잭션이 있다면 해당 트랜잭션 내에서 메소드를 실행하며, 그렇지 않으면 새로운 트랜잭션을 시작한다.
- SUPPORTS : 이미 실행중인 트랜잭션이 잇다면 해당 트랜잭션 내에서 메소드를 실행하며, 그렇지 않으면 트랜잭션 없이 메서드를 실행.
- MANDATORY : 이미 실행중인 트랜잭션이 잇다면 해당 트랜잭션 내에서 메소드를 실행하며, 그렇지 않으면 예외 발생
- REQUIRES_NEW : 항상 새로운 트랜잭션을 시작, 이미 실행중인 트랜잭션은 일시 중단.
- NOT_SUPPORTED : 트랜잭션 없이 메서드를 실행하며, 이미 실행 중인 트랜잭션이 있다면 일시 중단
- NEVER : 트랜잭션 없이 메서드를 실행하며, 이미 실행중인 트랜잭션이 있다면 예외를 발생
- NESTED : 이미 실행 중인 트랜잭션 내에서 중첩된 트랜잭션을 시작한다. 부모 트랜잭션 롤백 시 중첩된 트랜잭션도 롤백.
3. RollBack Rules (rollBackFor, noRollbackFor)
- 롤백에 대한 설정
- 스프링에서는 런타임 예외만 롤백 대상으로 삼는다.
- @Transactional(rollbackFor = Exception처리클래스.class)
- @Transactional(noRollbackFor = Exception처리클래스.class)
4. Timeout
- 지정한 시간 내에 해당 메서드 수행이 완료되지 않는다면 rollback 수행
- default는 -1로 no timeout을 의미.
- @Transactional(timeout=8)
5. readOnly
- 트랜잭션을 읽기 전용으로 설정
- INSERT, UPDATE, DELETE 작업시 예외 발생
- @Transactional(readOnly = true)
'Server Development > Spring Basic' 카테고리의 다른 글
Spring - Image Save (0) | 2023.06.11 |
---|---|
Spring - Spring Security (0) | 2023.04.23 |
Spring - Interceptor (0) | 2023.04.06 |
Spring - Jasypt (0) | 2023.04.06 |
Spring - Multiple Requests, Threads (0) | 2023.04.05 |