Spring - @Transactional

진경천·2024년 11월 19일

Transaction이란?

하나의 작업 단위로, 데이터베이스의 일관성을 유지하기 위해 수행되는 작업의 집합

  • Transaction Commit: 작업들이 성공해서 DB에 반영하는 것
  • Transaction Rollback: 하나의 작업이라도 실패하면 전체 작업을 DB 반영 이전으로 되돌리는 것

트랜잭션의 4가지 속성

원자성 (Atomicity)

  • 작업을 더 이상 쪼갤 수 없음을 의미
  • 트랜잭션 내의 모든 작업들은 하나의 작업을 한것과 같이 모두 성공하거나 모두 실패야한다. (All or Nothing)

일관성 (Consistency)

  • 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야한다.
  • 비즈니스 로직에서 의도한대로 일관성 있게 저장되거나 변경되어야 한다.

격리성 (Isolation)

  • 동시에 실행되는 트랜잭션들은 서로에게 영향을 미치지 않도록 독립적으로 실행되어야 한다.

지속성 (Durability)

  • 트랜잭션이 완료되면 그 결과가 항상 지속되어야 한다.
  • 시스템 장애 발생 시에도 데이터는 보존되어야 한다.

정리

특성 설명
원자성 (Atomicity) 트랜잭션이 완전히 성공하거나 완전히 실패하는 단일 단위로 처리되도록 보장
일관성 (Consistency) 무결성 제약조건처럼 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지하며, 트랜잭션이 영향을 받는 데이터를 허용된 방식으로만 변경해야 함.
격리성 (Isolation) 병행되는(동시 실행) 트랜잭션들이 서로 독립적으로 수행되어, 서로에게 영향을 미치지 않도록 각각 격리. 동시에 같은 리소스를 작업하지 않게 만듦.
지속성 (Durability) 트랜잭션이 성공하면 그 결과가 기록되어야 하며, 데이터가 영구적으로 저장(persistence)됨.

트랜잭션은 위 ACID 조건을 지키며 데이터에 대한 변경을 수행한다.

Spring Transaction

  • 트랜잭션 경계를 설정하기 위한 어노테이션
  • 메서드 또는 클래스의 실행을 하나의 트랜잭션으로 묶어 데이터 일관성을 보장
  • 클래스 레벨과 메서드 레벨에 적용 가능

여러 작업을 하나의 작업 단위로 묶어 트랜잭션 처리를 해야할 때 클래스 혹은 메서드에 선언하여 트랜잭션을 적용한다.

@Transactional
public class UserService {
	// 클래스 내 모든 메서드 트랜잭션 적용
}

@Transactional의 속성

속성 타입 설명
value String 사용할 트랜잭션 관리자
propagation enum: Propagation 트랜잭션 전파 방식 설정
isolation enum: Isolation 격리 수준 설정
readOnly boolean read-only 트랜잭션인지 아닌지를 결정
timeout int 트랜잭션 작업 시간 제한을 설정
rollbackFor Throwable 로부터 얻을 수 있는 Class 객체 배열 롤백이 수행되어야 하는 특정 예외 지정
rollbackForClassName Throwable 로부터 얻을 수 있는 클래스 이름 배열 롤백이 수행되어야 하는, 선택적인 예외 클래스 이름의 배열
noRollbackFor Throwable 로부터 얻을 수 있는 Class 객체 배열 롤백이 수행되지 않아야 하는, 선택적인 예외 클래스의 배열
noRollbackForClassName Throwable 로부터 얻을 수 있는 클래스 이름 배열 롤백이 수행되지 않아야 하는, 선택적인 예외 클래스 이름의 배열

트랜잭션 전파 예시

@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {
	innerMethod();
    // innerMethod가 outerMethod와 같은 트랜잭션 사용
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
	// 기존 트랜잭션은 중단하고 새로운 트랜잭션 생성
}
profile
어중이떠중이

0개의 댓글