본문 바로가기
Spring/Spring Data JPA

Spring Transactional 옵션

by 아이티.파머 2022. 4. 20.
반응형

Spring Transactional 옵션

Tranction 의 성질에 대해 생각해보자

원자성→ 한트렌젝션내에서 실행한 작업들은 하나로 간주하고 작업한다. 즉 모두성공, 혹은 모두 실패이다.

일관성→트렌젝션은 일관성있는 데이터베이스 상태를 유지한다.

격리성→동시에 실행되는 트렌젝션들이 서로에게 영향을 미치지 않도록 한다.

지속성→ 트렌젝션을 마치면 결과가 항상 저장되어야 한다.

Spring Transaction 속성

  • name - 메서드명
  • isolation (격리수준)
  • propagation(전파)
  • readOnly
  • 트렌젝션롤백 예외 (rollback-for, rollbackfor, rollbackForClassName)
  • 논트렌젝션 롤백 예외 (no-rollback-for )
  • timeout

name - 메서드명

메서드의 이름이며 와일드 문자()를 사용할 수 있습니다. 예로 'get'은 get으로 시작하는 모든 메서드를 가리키며 '*get'은 get으로 끝나는 모든 메서드를 가리킵니다.

timeout - 제한시간 (기본값 : -1)

트랜잭션의 제한시간을 설정합니다. DB가 해당기능을 지원해야 하며 기본값으로는 -1인 제한시간 없음이 설정됩니다.

Isolation (격리수준)

트랜젝션에서 일관성이 없는 데이터를 허용하도록 하는 수준을 말한다.

  • DEFAULT
  • DB에서 설정된 기본 격리 수준을 따릅니다.
  • READ_UNCOMMITTED (level 0)
  • 커밋되지 않은 데이터에 대한 읽기를 허용합니다. → ditry read 발생
  • READ_COMMITTED (level 1 )
    • 커밋된 트랜잭션에 대해 읽기를 허용합니다. → dirty read 방지
    • 커밋되지 않은 데이터는 읽을수 없다.
  • REPEATABLE_READ (level 2)
    • 동일한 필드에 대한 다중 접근 시 동일한 결과를 얻을 수 잇는 것을 보장합니다. → Non-Repeatable Read 방지
    • 트렌젝션이 완료될때까지 select 문장이 사용하는 모든 데이터에 shared lock이 걸림으로 다른 사용자는 그영역에 대한 수정이 불가능 하다.
    • 선행으로 읽는 트렌젝션이 발생되었을 경우 종료될때까지 후행 트렌젝션에서 갱신및 삭제가 불가능하다. 이는 같은 데이터에대해 다중 접근 했을시 동일한 결과를 얻을수 있는것을 보장해 준다.
  • SERIALIZABLE (level 3)
    • 데이터의 일관성 및 동시성을 위해 MVCC*(Multi Version Concurrency Control)을 사용하지 않습니다.
    • 트렌젝션이 완료될때까지 select 하는 모든 문장의 데이터에 shard lock 이 걸림으로 다른 사용자는 그영역에 해당되는 데이터 수정 입력이 불가능 하다.
    • 가장 높은 격리수준을 가지며 사용시 성능 저하가 있을 수 있습니다.
    • ⚠️ MVCC 는 다중 사용자 데이터베이스의 성능을 높이기 위한 기술로 데이터 조회시 LOCK 을 사용하지 않고 데이터의 버전관리를 통해 일관성및 동시성을 높이는 기술이다.

propagation - 전파옵션 (기본값 : REQUIRED)

  • REQUIRED
    • 디폴트 속성이다.
    • 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트렌젝션을 생성합니다.
  • REQUIRES_NEW
    • 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성되도록 합니다.
  • SUPPORT
    • 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 non- transactionally 로 실행됩니다.
      → 즉 이미시작된 트렌젝션이 있으면 참여하고 그렇치 않으면 트렌젝션이 없이 진행하게 만든다.
  • MANDATORY
    • REQUIRED와 비슷하게 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생됩니다.
      → 즉 이미시작된 트렌젝션이 있으면 해당 트렌젝션 내에서 실행되나 없으면 예외가 발생된다.
    • 독립적으로 트렌젝션을 진행해서는 안되는 경우에 사용한다.
  • NOT_SUPPORT
  • non-transactionally 로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지(보류) 됩니다.
  • NEVER
  • nontransactionally (트랜젝선 사용안함)로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생합니다.
  • NESTED
    • 이미 진행중인 트랜잭션이 있으면 중첩으로 트랜젝션을 만든다.
    • 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있습니다.
    • 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동합니다.
    • 단순 예시) 어떤 작업을 진행하는중에 로그는 꼭 DB 에 저장해야 할때 혹은 롤백 해야할때.
    • 상품을 결제한뒤 로그를 저장해야 하는데 로그저장에 실패 했다고해서 모두를 롤백시킬 필요는 없다. 이럴때 중첩트렌젝션을 생성하여 메인 트렌젝션이 정상 동작 하도록 한다.

read-only

읽기전용 (기본값 : false)

해당 메서드는 오로지 읽기에만 사용됩니다. INSERT나 UPDATE, DELETE문은 허용되지 않습니다.

만약 쓰기나 삭제가 실행될 경우 에러를 발생시킵니다.

rollback-for

예외처리 (기본값 : RuntimeException)

특정 예외가 발생했을 경우에 롤백되도록 설정합니다.

설정하지 않을 경우 오로지 RuntimeException을 상속받은 예외에만 롤백처리를 해줍니다.

no-rollback-for

예외처리 (기본값 : 없음)

ref.
http://egloos.zum.com/springmvc/v/499291
http://www.nextree.co.kr/p3180/
https://goddaehee.tistory.com/167

반응형