- 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)..
}
'SPRING > 소스코드' 카테고리의 다른 글
#31. Spring JDBC(Transaction 처리방법) (0) | 2016.05.20 |
---|---|
[스프링]@RequestParam 배열 처리 시 알게된 사항 (0) | 2016.05.02 |
Spring Scheduler(스프링 스케쥴러) 설정방법 및 사용방법 (2) | 2016.03.24 |
[Spring] Spring 3에서 작업 스케줄러(Task Scheduler) 메써드 구현하기 (0) | 2016.03.24 |
스프링MultipartFile멀티(다중)파일 업로드[@ModelAttribute이용,Spring Framework3.X MVC multiple file upload] (1) | 2015.10.13 |
Spring 4.0 기준 MappingJacksonJsonView 설정 (0) | 2015.07.09 |
Spring MVC AbstractView 사용하여 파일 다운로드 처리 하기 (0) | 2015.03.25 |
Spring3 MVC를 이용한 웹 요청 처리 (2) - HTML 폼 값 받기 (0) | 2014.11.17 |