ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] @Transactional
    [Spring] 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 발생 시 트랜잭션이 롤백되지 않습니다.
    }

     

Designed by Tistory.