[Spring] Transaction

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

댓글

Designed by JB FACTORY