💳 @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() {
    ...
}

⚠️ 주의사항

  • @Transactionalpublic 메서드에서 프록시를 통해 동작하는 경우가 많다.
  • 같은 클래스 내부에서 자기 자신을 호출하면 적용되지 않을 수 있다.
  • 트랜잭션이 적용되지 않는 문제는 보통 프록시 호출 방식과 관련이 있다.
  • rollbackFor, noRollbackFor 같은 옵션도 필요하면 함께 검토할 수 있다.

📌 정리

  • @Transactional은 Spring의 트랜잭션 관리 애너테이션이다.
  • 커밋과 롤백 경계를 명확히 해 준다.
  • public 메서드와 프록시 동작 방식을 이해하는 것이 중요하다.

연결문서

댓글남기기