@Transactional
어노테이션은 Spring에서 데이터베이스 트랜잭션의 범위를 정의하기 위해 사용됩니다
이 어노테이션은 메서드(또는 클래스)를 트랜잭션 내에서 실행되도록 표시합니다.
@Transactional
어노테이션은 클래스 수준, 메서드 수준 또는 둘 다에 적용할 수 있습니다.
- 클래스 수준에 적용하면 해당 클래스 내의 모든 메서드에 대한 기본 트랜잭션 동작이 설정됩니다.
트랜잭션 전파
트랜잭션 전파는 한 메서드에서 다른 메서드를 호출할 때 트랜잭션 동작이 어떻게 전파되는지를 정의합니다.
스프링은 @Transactional
어노테이션의 propagation
속성을 통해 다양한 전파 유형을 지원합니다. 일반적인 전파 유형은 다음과 같습니다:
- REQUIRED
- 메서드는 트랜잭션 내에서 실행되어야 합니다.
- 트랜잭션이 이미 있는 경우 해당 트랜잭션을 사용하고, 그렇지 않으면 새로운 트랜잭션을 생성합니다.
- REQUIRES_NEW
- 메서드는 새로운 트랜잭션 내에서 실행되어야 합니다.
- 이미 트랜잭션이 있는 경우 새로운 트랜잭션으로 전환될 때까지 해당 트랜잭션은 일시 중지됩니다.
- SUPPORTS
- 메서드는 트랜잭션의 존재 여부와 관계없이 실행될 수 있습니다.
- 이미 트랜잭션이 있는 경우 해당 트랜잭션을 사용하고, 없는 경우에는 트랜잭션 없이 실행됩니다.
격리 수준
격리 수준은 동시에 실행되는 트랜잭션들이 서로 어떻게 영향을 주고 받는지를 결정합니다.
스프링은 @Transactional
어노테이션의 isolation
속성을 사용하여 격리 수준을 지정할 수 있습니다.
일반적인 격리 수준은 다음과 같습니다:
- DEFAULT: 기본적으로 데이터베이스의 격리 수준이 사용됩니다.
- READ_UNCOMMITTED: 다른 트랜잭션에서 아직 커밋되지 않은 변경 사항이 보일 수 있는 가장 낮은 격리 수준입니다.
- READ_COMMITTED: 다른 트랜잭션이 커밋한 변경 사항만 보일 수 있는 격리 수준입니다.
- SERIALIZABLE: 다른 트랜잭션과 완전히 격리된 가장 높은 격리 수준입니다.
롤백 규칙
롤백 규칙은 트랜잭션을 롤백시킬 예외 유형을 정의합니다.
기본적으로 @Transactional
어노테이션은 체크 예외가 아닌 예외에 대해서만 트랜잭션 롤백을 수행합니다.
그러나 rollbackFor
또는 noRollbackFor
속성을 사용하여 추가적인 예외 유형을 지정할 수 있습니다.
@Transactional(rollbackFor = Exception.class)
public void myMethod() {
// …
}
위의 예시에서는 Exception
타입이나 그 하위 예외가 발생할 경우 트랜잭션 롤백이 수행됩니다.
읽기 전용 트랜잭션 : readOnly
읽기 전용 트랜잭션은 메서드가 데이터베이스에서 데이터를 읽기만 하고 쓰기 또는 갱신 작업을 수행하지 않는 것을 지정합니다.
이는 데이터베이스가 트랜잭션을 최적화하여 성능을 향상시킬 수 있게 합니다.
@Transactional
어노테이션의 readOnly
속성을 사용하여 메서드를 읽기 전용으로 지정할 수 있습니다.
@Transactional(readOnly = true)
public void readData() {
// …
}
위의 예시에서는 트랜잭션이 읽기 전용으로 구성되며, 트랜잭션 내에서 데이터 수정 시도가 발생하면 예외가 발생합니다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
MockMVC Get 응답 비어있을 때 해결 방법 (0) | 2023.07.20 |
---|---|
Junit Test 꿀팁 (0) | 2023.07.19 |
ACID (0) | 2023.07.18 |
Service의 책임 (0) | 2023.07.18 |
Controller의 책임 (0) | 2023.07.18 |