[Spring]

[Spring] @Transactional

jeayoung98 2024. 5. 27. 23:38

트랜잭션(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 발생 시 트랜잭션이 롤백되지 않습니다.
}