빠에야는 개발중

@Transactinal 본문

공부/스프링

@Transactinal

빠에야좋아 2020. 7. 23. 20:42

무엇인가?

@Transactional 어노테이션은 스프링에서 제공하는 클래스, 메소드 레벨의 트랜잭션 지원 어노테이션이다. 이 어노테이션이 선언되면 스프링은 프록시 객체를 생성하여 자동 commit, rollback 등의 트랜잭션 처리를 맡긴다. 클래스, 메소드 내에서 Persistence layer에 접근하여 데이터를 조작, 조회 할 때 사용한다. 주로 Service layer에서 사용하게된다.

트랜잭션 격리 수준

트랜잭션 어노테이션답게 트랜잭션의 기능들 중 하나인 격리 수준 속성을 가지고 있다.

  • Default
    • 기본 격리 수준(DB의 격리 수준을 따름)
  • READ_UNCOMMITTED (Level 0)
    • 커밋되지 않은 데이터 읽기 허용
    • 변경 중인 데이터에 접근할 수 있다.
    • Dirty read 문제가 발생할 수 있다.
  • READ_COMMITTED (Level 1)
    • 커밋된 데이터만 읽기 허용
    • 변경 중인 데이터에 접근할 수 없다.
    • Dirty read 문제를 방지하는 레벨
  • REPEATABLE_READ (Level 2)
    • 한 트랜잭션이 진행되는 동안 다른 트랜잭션이 해당 데이터를 수정할 수 없다.
    • 결과적으로 다른 트랜잭션은 일관성 있는 데이터를 가져가게 된다.
    • Non-repeatable read 문제를 방지하는 레벨
  • SERIALIZABLE (Level 3)
    • 한 트랜잭션이 진행되는 동안 다른 트랜잭션은 전혀 접근할 수 없다.
    • 가장 강한 격리 수준이지만 성능이 크게 저하된다.
    • Phantom read 문제를 방지하는 레벨

격리 수준이 올라갈수록 성능은 떨어진다.

@Transactional(isolation=Isolation.DEFAULT)
public void method () { ... }

트랜잭션 전파

어떤 트랜잭션 내에서 또 다른 트랜잭션을 호출하게 될 때 해당 트랜잭션의 동작을 제어할 수 있는 옵션이다.

  • REQUIRED

    • 기본 속성. 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다.
  • SUPPORTS

    • 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행하게 만든다.
  • REQUIRES_NEW

    • 항상 새로운 트랜잭션을 시작한다.
    • 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다.
  • MANDATORY

    • REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다.
    • 반면에 트랜잭션이 시작된 것이 없으면 새로 시작하는 대신 예외를 발생시킨다.
    • 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.
  • NOT_SUPPORTED

    • 트랜잭션을 사용하지 않게 한다.
    • 이미 진행 중인 트랜잭션이 있으면 보류시킨다.
  • NEVER

    • 트랜잭션을 사용하지 않도록 강제한다.
    • 이미 진행 중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다.
  • NESTED

    • 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
    • 중첩된 트랜잭션은 먼저 시작된 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않는다.
@Transactional(propagation = Propagation.REQUIRED)
public void method () { ... }

Read Only

  • 트랜잭션을 읽기 전용으로 설정한다.
  • 내부에서 데이터 수정 작업(INSERT, UPDATE, DELETE)이 동작하면 예외를 발생한다.
    @Transactional(readOnly = true)
    public void method () { ... }

트랜잭션 롤백 예외

특정한 예외를 지정하여 해당 예외가 발생했을 때 트랜잭션을 roll-back 시킬 수 있다.

// 해당 예외가 발생했을때 롤백
@Transactional(rollbackFor = Exception.class)
public void method () { ... }

// 해당 예외가 발생해도 롤백하지 않음
@Transactional(noRollbackFor = Exception.class)
public void method () { ... }

timeout

해당 트랜잭션에 시간 제한을 건다. 기본 값은 -1(제한 없음)이다. 단위는 초이다.

@Transactional(timeout = 10)
public void method () { ... }

 

참고/출처 : 갓대희의 작은공간 [ https://goddaehee.tistory.com/167 ]

'공부 > 스프링' 카테고리의 다른 글

롬복(lombok)  (0) 2018.02.26
Controller의 String 리턴  (0) 2018.02.05
스프링 퀵 스타트 : chap 5-2  (0) 2018.02.05
스프링 퀵 스타트 : chap 5-1  (0) 2018.02.04
스프링 퀵 스타트 : chap 4-2  (1) 2018.02.01
Comments