https://jepa.tistory.com/87#%EA%B3%A0%EB%A6%BD%EC%84%B1(Isolation)-1
[DB] 트랜잭션과 ACID
J가 H에게 20만원을 이체할 때, 계좌 변동은 J의 계좌에서 20만원이 제거되고, H의 계좌에 20만원이 추가되어 최종적으로 J는 80만원, H는 220만원이 된다. SQL문으로 아래처럼 표현할 수 있다.UPDATE acc
jepa.tistory.com
@Transactional은 스프링 프레임워크에서 제공하는 어노테이션으로, 트랜잭션을 적용하는 데 사용된다. 이 어노테이션은 메서드 또는 클래스에 적용될 수 있으며, 메서드 내에서 수행되는 작업들이 하나의 트랜잭션으로 묶이도록 지원한다.
@Transactional 어노테이션을 사용하면 트랜잭션 기능이 적용된 프록시 객체 생성(Platform Transaction Manager)한다. 스프링은 트랜잭션의 시작과 종료, 롤백 여부 등을 자동으로 처리하여 개발자가 트랜잭션 관리에 대해 크게 신경 쓰지 않아도 되게끔 한다.
사용법
1. 메서드에 적용
@Transactional
public void someTransactionalMethod() {
// 트랜잭션 범위 내에서 수행되어야 하는 작업들
}
2. 클래스에 적용
@Transactional
public class SomeService {
public void someMethod() {
// 트랜잭션 범위 내에서 수행되어야 하는 작업들
}
}
특징
- 트랜잭션의 시작과 종료
- 메서드가 호출되면 트랜잭션이 시작되고, 메서드가 완료되면 트랜잭션이 종료된다.
- 자동 롤백
- 런타임 예외가 발생하면 자동으로 롤백이 수행된다.
- 기본적으로 체크 예외는 롤백하지 않음
- RuntimeException 및 그 하위 클래스에 대해서만 자동 롤백이 수행되며, 일반적인 체크 예외는 롤백하지 않는다. 필요하다면 rollbackFor 속성을 사용하여 롤백할 예외 클래스를 명시할 수 있다.
Spring 트랜잭션 관련 세부 설정
1. Isolation(격리수준) 설정
트랜잭션에서 격리수준(일관성이 없는 데이터를 허용하는 수준)을 지정한다.
@Transactional(isolation=isolation.DEFAULT)
DEFAULT
READ_UNCOMMITTED (Dirty Read 발생)
커밋이 된 확정 값만 접근이 가능하다.
READ_COMMITTED (Non-Repeatable Read 방지)
REPEATABLE_READ (Non-Repeatable Read 방지)
트랜잭션이 완료될때까지 SELECT 를 ROCK을 건다.
SERIALIZABLE (Phantom Read 방지)
완료까지 모두 락
2. Propagation(전파수준)
propagation 속성을 사용하여 트랜잭션 전파 동작을 지정할 수 있다. 트랜잭션 동작 중 다른 트랜잭션을 호출할 때 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성값이다.
(호출한 트랜잭션이 부모가 되어 호출된 트랜잭션이 자식이 된다.)
REQUIRED(default)
부모 트랜잭션 안에서 자식 트랜잭션이 실행되게 한다.
SUPPORTS
이미 진행한 트랜잭션이 있다면 참여하고 없으면 트랜잭션 없이 진행하게 만든다.
REQURES_NEW
자식 트랜잭션도 자신만의 트랜잭션을 가진다.
NESTED
중첩 트랜잭션(실행하고 있는 트랜잭션안에 트랜잭션을 실행)을 실행한다.
부모의 결과는 자식에게 영향을 주지만 자식의 결과는 부모에게 영향을 주지 않는다.
로그를 사용하는 경우 메인 로직이 실패하면 로그 작성도 롤백되어야 하지만, 로그 작성이 실패한다해도 메인로직은 롤백이 되면 안된다.
3. ReadOnly 속성
readOnly 속성을 이용하여 읽기 전용 트랜잭션을 설정할 수 있다.
@Transactional(readOnly=true) // default는 false
이는 성능 향상을 위해 사용되거나 읽기 외(쓰기, 삭제)작업을 방지하는 용도로 사용될 수 있다.
4. 트랜잭션 롤백 예외
예외 발생시 롤백시킬 경우를 설정한다.
@Transactional(rollbackFor=Exception.class)
@Transactional(noRollbackFor=Exception.class)
// default는 RuntimeException,Error
특정 Exception에 대해서는 rollback을 진행시키지 않고 싶을 때 사용할 수 있다.
5. timeout 속성
timeout 속성을 사용하여 트랜잭션 타임아웃을 설정할 수 있다.
@Transactional(timeout=10)
일정 시간 내에 트랜잭션을 끝내지 못할 경우 롤백을 시키도록 설정할 수 있다.
격리수준이 높은 하나의 트랜잭션이 너무 오래 걸리면 시스템의 성능이 떨어질 수 있는데 이런 경우 timeout 속성을 사용해서 막을 수 있다.
'spring > spring' 카테고리의 다른 글
| [스프링 부트 핵심 가이드] HTTP 요청 메서드 받기 (0) | 2024.02.01 |
|---|---|
| [스프링 부트 핵심 가이드] pom.xml (0) | 2024.02.01 |
| [Spring] 프로젝트 구조 알아보기 (0) | 2024.01.30 |
| [스프링 부트 핵심 가이드] MSA, 스프링 부트 동작방식,레이어드 아키텍처 (0) | 2024.01.25 |
| [스프링 부트 핵심 가이드] 스프링 (0) | 2024.01.24 |