Spring Transaction

업데이트:

Spring Transaction1

  • Spring Transaction은 어노테이션 기반으로 수행이 된다.
  • Spring Bean2으로 정의 된 Method를 트랜잭션 관리를 하고자 할 때, @Transactional 어노테이션을 활용하면 프록시 패턴의 AOP3를 사용하여 원하는 수준의 트랜잭션 관리를 할 수 있다. tx

Isolation Level

  • 트랜잭션에서 일관성이 없는 데이터를 다른 트랜잭션이 읽는 것을 허용하도록 하는 수준이다.

트랜잭션 경쟁(Race Conditiaon)에 대한 문제점

Dirty Read

커밋 전 데이터 조회와 롤백 후 데이터 조회의 데이터 불일치 문제이다.

Non-Repeatable Read

한 트랜잭션에서 데이터 변경 전과 후에 같은 조회 쿼리를 수행 시, 값이 변경되면서 결과가 달라지는 문제이다.

Phantom Read

한 트랜잭션에서 데이터 추가 전과 후에 같은 조회 쿼리를 수행 시, 값이 추가되면서 결과가 달라지는 문제이다.

종류

기본적으로 Isolation Level이 높아질수록 데이터를 점유하는 권한이 강화되고, 이로 인해서 수행 속도는 느려진다.

DEFAULT

  • 사용하는 Database의 Isolation Level을 따라 적용 한다.

    READ_UNCOMMITED(Level 0)

  • 트랜잭션에서 처리 중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
  • Dirty Read 문제가 발생한다.

    READ_COMMITED(Level 1)

  • 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용한다.
  • Oracle, MSSQL 등의 일반적인 RDBMS에서 Default Isolation Level로 사용한다.
  • Dirty Read 문제를 방지하나, Non-Repeatable Read 문제가 발생한다.

    REPREATABLE_READ(Level 2)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock을 걸어 다른 사용자들은 그 영역의 데이터에 대한 수정이 불가능하다.
  • MySQL와 같은 특정 RDBMS에서 Default Isolation Level로 사용한다.
  • Dirty Read, Non-Repeatable Read의 문제들을 방지하나, Phantom Read 문제가 발생한다.

    SERIALIZABLE(Level 3)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 SHared Lock을 걸어 다른 사용자들은 그 영역의 데이터에 대한 수정 및 입력이 불가능하다.
  • Dirty Read, Non-Repeatable Read, Phantom Read의 문제들을 방지한다.

Propagation

트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다.

종류

REQUIRED

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

REQUIRES_NEW

부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션을 생성한다.

SUPPPORT

부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 Non-Transactionally로 실행한다.

MANDATORY

부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 Exception이 발생한다.

NOT_SUPPORT

Non-Transactionally로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지한다,

NEVER

Non-Transactionally로 실행하며 부모 트랜잭션이 존재하면 Exception이 발생한다.

NESTED

  • 부모 트랜잭션이 존재하면 부모 트랜잭션 내에서 실행되며, 별개로 커밋되거나 롤백될 수 있다.
  • 부모 트랜잭션이 존재하지 않으면 RQUIRED와 동일하게 실행된다.

Readonly

  • 해당 Transaction 내에서 데이터를 읽기만 할지를 결정한다.
  • Default : false

RollbackFor/NoRollbackFor

RollbackFor

특정 Exception을 추가 할 수 있으며, 해당 Exception이 발생하면 Rollback을 수행한다.

NoRollbackFor

특정 Exception을 추가 할 수 있으며, 해당 Exception이 발생하면 Rollback을 수행하지 않는다.

Timeout

  • 지정한 시간 내에 해당 메서드 수행이 완료되지 않은 경우, Rollback을 수행한다.
  • Default : -1(No-Timeout)

Reference

댓글남기기