[Spring] Transaction
- BACKEND/Spring
- 2017. 6. 15. 12:12
Transaction Manager
▪ Transaction을 처리하는 객체
– Transaction의 경계를 관리한다.
– 경계란 : 트랜잭션의 시작, 정상종료(commit), 비정상종료(rollback) 결정
▪ Spring 제공 주요 Transaction Manager
– DataSourceTransactionManager
▪ Connection의 Transaction API 이용해 관리
▪ JDBC API, MyBatis 이용 시 사용
▪ Property로 DAO가 사용하는 DataSource를 제공 받아야 한다.
– JpaTransactionManager
▪ JPA(Java Persistence API)를 이용하여 Data처리한 경우 사용한다.
– JtaTransactionManager
▪ 분산 Transaction처리가 필요한 경우 사용한다.
Transaction 처리
▪ 선언적 Transaction 처리
– @Transactional 어노테이션(Annotation)을 이용한 처리
▪ 메소드 별 세밀한 설정에 유리
– 스프링 설정 파일에 설정을 통해 처리
▪ aop와 tx 스키마 태그를 이용한 처리
▪ 일괄처리에 유리
@Transactional 어노테이션을 이용한 처리
▪ Spring 설정파일에 Transaction Manager 등록
– tx 네임스페이스 추가.
– Transaction manager를 Spring container에 등록
1. <bean>으로 TransactionManager 객체 등록
2. <tx:annotation-driven transaction-manager="transactionManager"/>
▪ Transaction 처리가 필요한 메소드 선언부에 @Transactional 어노테이션 선언
– Business Logic 처리 메소드 선언부에 등록
@Transactional 속성
속성 |
값 |
propagation |
TX 전파규칙. Propagation Enum의 값으로 설정 |
isolation |
TX 격리레벨. Isolation Enum의 값으로 설정 |
readOnly |
읽기 전용 여부. boolean(기본 : false) |
rollbackFor |
롤백할 예외타입 설정. Class 배열(rollbackFor={XX.class} |
noRollbackFor |
롤백하지 않을 예외타입 설정. Class 배열 |
timeout |
TX 타임아웃 시간 설정. 정수 초 |
Transaction 속성
▪ propagation
– Transaction 전파규칙 지정
– 호출 하는 메소드와 호출되는 메소드간의 transaction경계 지정
– Default : REQUIRED
– 값 : Propagation 타입에 정의된 상수 사용
예) @Transactional(propagation=Propagation.REQUIRES)
사용값 |
설명 |
REQUIRED | 디폴트 속성. 기존 TX있으면 참여 없으면 새로 시작 |
SUPPORTS |
기존 TX있으면 참여 없으면 TX 없이 진행 |
MANDATORY |
기존 TX있으면 참여 없으면 예외 발생 |
REQUIRES_NEW |
항상 새로운 TX 시작. 기존 TX는 잠시 보류 시킨다 |
NOT_SUPPORTED |
TX을 사용하지 않는다. 기존 TX는 잠시 보류 시킨다 |
NEVER |
TX 사용하지 않게 강제. 기존 TX있으면 예외 발생 |
▪ isolation
– Isolation(격리) Level 지정
– 여러 transaction이 동시에 진행 될 때 한 Transaction이 처리 중인 데이터가 다른 Transaction으로 부터 얼만큼 격리
될 것 인가에 대한 격리 수준 등록
– Default : DEFAULT
– 값 : Isolation 타입에 정의된 상수 사용
– 예) @Transactional(isolation=Isolation. SERIALIZABLE)
사용값 |
설명 |
DEFAULT |
DB의 디폴트 설정을 따른다. 일반적으로 READ_COMMITED가 디폴트인 경우가 많음 |
READ_COMMITED | Commit 되지 않은 Data(Row)는 다른 TX이 읽을 수 없다 Select 중인 Data들(Row들)를 다른 TX이 수정할 수 있다. |
READ_UNCOMMITED |
처리중인 Data들(Row들)가 commit 되지 않아도 다른 TX이 읽을 수있다. |
REPEATABLE_READ | Select 중인 Data(Row)를 다른 TX이 수정할 수없다. 새로운 ROW를 추가할 수는 있다. |
SERIALIZABLE |
여러 TX이 동시에 같은 TABLE에 접근하지 못한다. |
▪ 격리 수준 : READ_UNCOMMITED가 가장 낮고 SERIALIZABLE이 가장 높음
– 격리 수준이 낮을 수록 성능은 좋으나 안전성이 떨어짐
▪ timeout
– Transaction에 제한 시간을 지정
– 지정한 시간 안에 transaction 작업이 완료하지 않으면 rollback 시킴
– 값 : int - 설정할 초
– Default : 시스템의 제한시간 따름
– 예) @Transactional(timeout=1000)
▪ readOnly
– Transaction을 읽기 전용으로 설정
– INSERT, UPDATE, DELETE 등 쓰기작업이 발생하면 예외 발생
– 값 : true / false(Default)
– 예) @Transactional(readOnly=true)
▪ rollbackFor
– rollback 대상에 추가시킬 checked 예외 등록
– 선언적 Transaction에서는 런타임 예외의 경우에만 rollback 처리함. checked 예외는 rollback
되지 안는다.
– 값
▪ Class[] 타입 - 추가할 Exception class들
– 예) @Transactional(rollbackFor=Exception.class)
▪ noRollbackFor
– unchecked 계열 중 rollback 대상에서 제외할 예외 선언
– 사용법은 rollback -for 와 동일
'BACKEND > Spring' 카테고리의 다른 글
[Spring] Spring MVC 개념 (0) | 2017.06.16 |
---|---|
[Spring] Spring MVC 예제 (0) | 2017.06.15 |
[Spring] AOP (0) | 2017.06.14 |
[Spring] Spring에서 Mybatis사용하기 (0) | 2017.06.13 |
[Spring] Spring 개념 자료 (0) | 2017.06.13 |