728x90
반응형

- Spring에서 지원하는 transaction

 

TransactionDefinition

 

public interface TransactionDefinition {
  int getPropagationBehavior();
  int getIsolationLevel();
  int getTimeout();
  boolean isReadOnly();
}


getTimeOut : 실행하는 트랜잭션이 시작해서 종료할 때가지의 시간을 초단위 제어

isReadOnly : 실행하는 트랜잭션이 red-only 상태여부를 결정가능

getIsolationLevel : 트랜잭션의 격리레벨을 결정

getPropagationBehavior : 트랜잭션이 실행되어야 하는 범위에 대한 제어 및 여러개의 트랜잭션이 상호작용하는 것에 대한 결정

 

- 격리레벨 이해하기

 

격리레벨(Isolation level)


1. Read Uncommitted(커밋되지 않은 읽기)
   한 사용자가 "A"라는 데이타를 "B"라는 데이타로 변경하는 동한 다른 사용자는 "B”   라는 아직 완료되지 않은  
   Uncommitted 혹은 Dirty 데이터 "B"를 읽을 수 있다.    다른 트랜잭션에서 커밋하지 않은 데이타를 읽을 수 있음.

 

2. Read Committed (커밋된 읽기)
   SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸립니다.    그러므로, 어떠한 사용자가A라는 데이터를 B라는    데이터로 변경하는 동안 다른   사용자는 해당 데이터에 접근할 수 없습니다.     다른 트랜잭션에 의해 커밋된 데이터를 읽을 수 있다.

 

3. Repeatable Read (반복읽기)
   트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로    다른 사용자는 그 영역에    해당되는 데이터에 대한 수정이 불가능합니다. 가령,    Select col1 from A where col1 between 1 and 10을 수행하였고    이 범위에 해당하는    데이터가 2건이 있는 경우(col1=1과 5) 다른 사용자가 col1이 1이나 5인 Row에    대한 UPDATE이    불가능합니다. 하지만, col1이 1과 5를 제외한 나머지 이 범위에    해당하는 Row를 INSERT하는 것이 가능합니다.     처음에 읽어온 데이타와 두 번째 읽어온 데이타가 동일한 값을 갖는다.

 

4. Serializable (직렬 혹은 순차기능)
  트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이   걸리므로 다른 사용자는 그 영역에 해당  되는 데이터에 대한 수정 및 입력이   불가능합니다. 예를 들어, Repeatable Read의 경우 1에서 10 사이에 해당되는   데이 터에 대한 UPADTE이 가능하였습니다. 하지만 이 Level에서는 UPDATE 작업도   허용하지 않습니다.
   동일한 데이터에 대해서 동시에 두개 이상의 트랜잭션이 수행될 수 없다.

 

 

- 전달행위 알아보기

 

TransactionDefinition 

PROPAGATION_REQUIRED

하나의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면 새로운 트랜잭션을 시작. 가장 자주 사용되는 옵션

PROPAGATION_SUPPORTS

하나의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면  -트랜잭션 형태로 수행

PROPAGATION_MANDATORY

이미 트랜잭션이 존재하면 그 트랜잭션을 지원하고, 활성화된 트랜잭션이 없으면 예외를 던진다.

PROPAGATION_REQUIRES_NEW

언제나 새로운 트랜잭션을 수행,  이미 활성화된 트랜잭션이 있다면 일시정지한다.

PROPAGATION_NOT_SUPPORTED

트랜잭션을 실행하지 않고 있다가 트랜잭션이 존재하게 되면 이를 일시중지

PROPAGATION_NEVER

트랜잭션을 실행하지 않고 있다가 트랜잭션이 존재하게 되면 예외를 던진다.

PROPAGATION_NESTED

현재의 트랜잭션이 존재하면 중첩된 트랜잭션 내에서 실행, 없으면 REQUIRED 처럼 작동

 

 

- 트랜잭션의 상태와, 트랜잭션의 실질적인 관리자에 대해 알아보기

 

TransactionStatus

 

트랜잭션의 상태를 관리하는 역할을 담당. PlatformTransactionManager에서 트랜잭션을 Commit할지 Rollback 할지를 결정하기 위해 사용한다.

 

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   void setRollbackOnly();
   boolean isRollbackOnly();
}

 

PlatformTransactionManager

 

실질적인 트랙잭션을 실행하는 역할을 한다. commit/rollback작업을 실행하도록 지원

public interface PlatformTransactionManager {
  void commit(TransactionStatus status)...
  void rollback(TransactionStatus status)..
}

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,