@Transactional

wkdtmddus·2023년 8월 19일
0
post-custom-banner

@Transactional은 Spring Framework에서 제공하는 어노테이션으로, 메서드나 클래스에 이 어노테이션을 사용하여 데이터베이스 트랜잭션을 관리할 수 있도록 도와주는 기능을 제공합니다.
이 어노테이션을 사용하면 메서드 실행 도중에 트랜잭션의 시작, 커밋, 롤백 등을 자동으로 처리할 수 있습니다.


@Transactional 어노테이션은 다음과 같은 중요한 특성을 가지고 있습니다.

  1. Propagation(전파 속성) :

    메서드 내에서 실행되는 트랜잭션과 외부 트랜잭션 간의 상호 작용을 정의합니다.
    예를 들어, REQUIRED, REQUIRES_NEW, NESTED 등의 전파 속성을 설정할 수 있습니다.

  2. Isolation(격리 수준) :

    동시에 여러 트랜잭션이 실행될 때 어떻게 격리되어야 하는지를 정의합니다.
    READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 등의 격리 수준을 설정할 수 있습니다.

  3. ReadOnly(읽기 전용) :

    트랜잭션 내에서 데이터를 읽기만 하는 경우, 해당 트랜잭션을 읽기 전용으로 설정하여 성능을 향상시킬 수 있습니다.

  4. Timeout(타임아웃) :

    트랜잭션이 얼마 동안 실행될 수 있는지를 설정합니다.
    시간 초과가 발생하면 트랜잭션은 롤백될 수 있습니다.

  5. RollbackFor, NoRollbackFor :

    특정 예외 유형에 대한 롤백 여부를 설정할 수 있습니다.

  6. Propagation, Isolation, Timeout 등의 기본 설정 :

    @Transactional 어노테이션은 기본적으로 메서드 수준에서 트랜잭션을 관리합니다.
    클래스 수준에도 설정할 수 있으며, 클래스 수준에서 설정한 값은 메서드 수준에서 재정의할 수 있습니다.


@Transactional 어노테이션의 전파 속성 DEFAULT와 REQUIRES_NEW

DEFAULT

@Service
public class TransactionService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void updateUserWithDefaultTransaction(User user) {
        // 데이터 변경 작업
        userRepository.save(user);
    }

    @Transactional
    public void processWithDefaultTransaction(User user) {
        // 여러 데이터 변경 작업
        updateUserWithDefaultTransaction(user);
        // 다른 데이터 변경 작업
    }
}

위의 예시에서 updateUserWithDefaultTransaction 메서드와 processWithDefaultTransaction 메서드는 모두 @Transactional 어노테이션이 기본 설정인 DEFAULT로 실행됩니다.
따라서 이 두 메서드 안에서 수행되는 데이터 변경 작업은 하나의 트랜잭션으로 묶이게 됩니다.

REQUIRES_NEW

@Service
public class TransactionService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateUserWithRequiresNewTransaction(User user) {
        // 데이터 변경 작업
        userRepository.save(user);
    }

    @Transactional
    public void processWithRequiresNewTransaction(User user) {
        // 여러 데이터 변경 작업
        updateUserWithRequiresNewTransaction(user);
        // 다른 데이터 변경 작업
    }
}

위의 예시에서 updateUserWithRequiresNewTransaction 메서드와 processWithRequiresNewTransaction 메서드는 각각 @Transactional 어노테이션의 propagation 속성을 사용하여 REQUIRES_NEW 설정으로 실행됩니다.
따라서 processWithRequiresNewTransaction 메서드 안에서 updateUserWithRequiresNewTransaction 메서드를 호출하면 독립적인 새로운 트랜잭션이 생성되어 실행됩니다.


이렇게 트랜잭션의 범위와 특성을 설정함으로써 데이터 변경 작업의 격리 수준과 처리 방식을 조절할 수 있습니다.

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 8월 19일

유익한 자료 감사합니다.

답글 달기