@Transactional
💳 @Transactional
정의
@Transactional은 메서드 또는 클래스 단위로 트랜잭션 경계를 설정하고, 커밋과 롤백을 관리하는 애너테이션이다.
데이터베이스 작업을 원자적으로 처리할 수 있게 해 주며, 예외 발생 시 자동 롤백을 기대할 수 있다.
🧩 Artifact
spring-tx
🛠 역할
- 트랜잭션을 시작한다.
- 정상 종료 시 커밋한다.
- 예외 발생 시 롤백한다.
- 읽기 전용, 격리 수준, 타임아웃 같은 옵션을 설정할 수 있다.
⚙️ 트랜잭션 격리 수준
- 여러 트랜잭션이 동시에 실행될 때 데이터 일관성을 어떻게 유지할지 정한다.
| 격리 수준 | 설명 |
|---|---|
DEFAULT |
데이터베이스 또는 트랜잭션 매니저 기본값을 사용한다. |
READ_UNCOMMITTED |
커밋되지 않은 변경도 읽을 수 있는 가장 낮은 수준이다. |
READ_COMMITTED |
커밋된 변경만 읽는다. 일반적으로 많이 사용한다. |
REPEATABLE_READ |
같은 트랜잭션 안에서 반복 읽기 결과가 일관된다. |
SERIALIZABLE |
가장 엄격한 수준으로 동시성이 낮다. |
🧪 사용 예시
@Transactional
public void updateUser() {
...
}
@Transactional(readOnly = true)
public User findUser(Long id) {
...
}
@Transactional(timeout = 3, isolation = Isolation.READ_COMMITTED)
public void process() {
...
}
⚠️ 주의사항
@Transactional은 public 메서드에서 프록시를 통해 동작하는 경우가 많다.- 같은 클래스 내부에서 자기 자신을 호출하면 적용되지 않을 수 있다.
- 트랜잭션이 적용되지 않는 문제는 보통 프록시 호출 방식과 관련이 있다.
rollbackFor,noRollbackFor같은 옵션도 필요하면 함께 검토할 수 있다.
📌 정리
@Transactional은 Spring의 트랜잭션 관리 애너테이션이다.- 커밋과 롤백 경계를 명확히 해 준다.
- public 메서드와 프록시 동작 방식을 이해하는 것이 중요하다.
댓글남기기