[Spring] @Transactional
트랜잭션(Transaction) 이란 ?
데이터베이스 작업의 단위로 , 여러 작업이 하나의 묶음으로 처리되는 것 .
특징
원자성 : 트랜잭션 내의 모든 작업은 모두 성공하거나 모두 실패해야함
일관성 : 트랜잭션이 완료되면 데이터 베이스가 일관된 상태를 유지해야함
격리성 : 동시에 실행되는 트랜잭션은 서로 간섭하지 않아야함
지속성 : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야함
@Transactional 어노테이션이란 ?
특정 메서드나 클래스가 트랜잭션 내에서 실행되도록 지정할 수 있음.
기본 사용법
메서드에 적용
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyService {
@Transactional
public void performTransactionalOperation() {
// 트랜잭션이 시작.
// 데이터베이스 작업수행.
// 메소드가 성공적으로 완료되면 트랜잭션이 커밋.
// 예외가 발생하면 트랜잭션이 롤백.
}
}
클래스에 적용
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class MyService {
public void method1() {
// 트랜잭션 내에서 실행.
}
public void method2() {
// 트랜잭션 내에서 실행.
}
}
주요속성
propagation
트랜잭션의 전파 행동을 정의.
현재 트랜잭션이 존재할때 새로운 트랜잭션을 시작할지 여부 결정.
'REQUIRED' (기본값) : 현재 트랜잭션이 존재하면 그 트랜잭션 내에서 실행하고, 존재하지 않으면 새로운 트랜잭션을 시작
'REQUIREDS_NEW' : 항상 새로운 트랜잭션을 시작
'MANDATORY' : 현재 트랜잭션이 존재해야 하며, 존재하지 않으면 예외발생
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method() {
// 새로운 트랜잭션에서 실행됩니다.
}
isolation
트랜잭션의 격리 수준을 정의.
다른 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 설정할 수 있음.
'READ_UNCOMMITTED' : 다른 트랜잭션에서 커밋되지 않은 변경사항을 읽을 수 있음.
'READ_COMMITTED' (기본값) : 다른 트랜잭션에서 커밋된 변경사항만 읽을 수 있음.
'REPEATABLE_READ' : 트랜잭션 내에서 읽은 데이터가 변경되지 않음을 보장.
'SERIALIZABLE' : 가장 높은 격리 수준으로 , 트랜잭션이 직렬화된 것 처럼 실행.
@Transactional(isolation = Isolation.SERIALIZABLE)
public void method() {
// 높은 격리 수준에서 실행됩니다.
}
timeout
읽기 전용임을 명시.
읽기 전용 트랜잭션은 성능 최적화를 할 수 있음.
@Transactional(readOnly = true)
public void method() {
// 읽기 전용 트랜잭션으로 실행됩니다.
}
rollbackFor
특정 예외가 발생했을 때 트랜잭션을 롤백하도록 설정 .
@Transactional(rollbackFor = Exception.class)
public void method() {
// Exception 발생 시 트랜잭션이 롤백됩니다.
}
noRollbackFor
특정 예외가 발생해도 트랜잭션을 롤백하지 않도록 설정.
@Transactional(noRollbackFor = IllegalArgumentException.class)
public void method() {
// IllegalArgumentException 발생 시 트랜잭션이 롤백되지 않습니다.
}