트랜잭션 매니저란?
- 스프링에서 제공하는 트랜잭션 처리를 위한 추상화 클래스
- 트랜잭션 관리는 서비스 클래스에서 진행하는 것을 권장한다.
- 예외 발생가 발생하게 되면 예외가 발생하기 전까지 진행했던 DB 처리 작업들을 모두 롤백시킨다. (DAO 메소드)
- 트랜잭션 관리가 필요한 쿼리의 종류는 INSERT, UPDATE, DELETE 총 3가지이다.
- Spring에서는 일관적인 트랜잭션 관리를 위해서 spring-tx 클래스를 제공한다.
사용방법
- @Transactional 어노테이션을 사용한다.
- org.springframework.transaction.annotation.Transactional
- 메소드, 클래스, 인터페이스 위에 추가하여 사용하다.
- @Transactional 어노테이션이 적용된 범위에서는
트랜잭션 기능이 포함된 프록시 객체가 생성되어
자동으로 commit/rollback을 진행한다. - 사용 예시
@Transactional의 옵션
- isolation
- 트랜잭션에서 일관성없는 데이터 허용 수준을 설정한다.
- 종류
- DEFAULT (기본값) : DB의 lsolation Level을 따른다.
- READ_UNCOMMITED (level 0) : 커밋되지 않는 데이터에 대한 읽기를 허용한다.
- READ_COMMITED (level 1) : 커밋된 데이터에 대해 읽기를 허용한다.
- REPEATEABLE_READ (level 2) : 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장한다.
- SERIALIZABLE (level 3) : 가장 높은 격리, 성능 저하의 우려가 있음
- 사용법 예시
- propagation
- 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션이다.
- 종류
- REQUIRED
- 기본값
- (A) 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따른다.
- (B) 진행중이 아니라면 새로운 트랜잭션을 생성한다.
- REQUIRES_NEW
- (A) 항상 새로운 트랜잭션을 생성한다.
- (B) 이미 진행중인 트랜잭션이 있다면 잠깐 보류하고 해당 트랜잭션 작업을 먼저 진행한다.
- SUPPORT
- (A) 이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따른다.
- (B) 진행 중인 트랜잭션이 없다면 트랜잭션을 설정하지 않는다.
- NOT_SUPPORT
- 이미 진행중인 트랜잭션이 있다면 보류하고, 트랜잭션 없이 작업을 수행한다.
- MANDATORY
- (A) 이미 진행 중인 트랜잭션이 있어야만 작업을 수행한다.
- (B) 진행 중인 트랜잭션이 없다면 Exception을 발생시킨다.
- NEVER
- (A) 트랜잭션이 진행중이지 않을 때 작업을 수행한다.
- (B) 진행중인 트랜잭션이 있다면 Exception을 발생시킨다.
- NESTED
- (A) 진행중인 트랜잭션이 있으면 중첩된 트랜잭션이 실행된다.
- (B) 진행중인 트랜잭션이 없으면 REQUIRED와 동일하게 실행된다.
- 사용법 예시
- noRollbackFor
- 특정 예외 발생 시 rollback하지 않는다.
- 사용법 예시
- rollbackFor
- 특정 예외 발생 시 rollback한다.
- @Transactional 어노테이션은 기본적으로 Unchecked Exception, Error 만을 rollback한다.
- 모든 예외에 대해서 롤백시키기 위해서는 모든 예외의 기본 클래스인 Exception 클래스를 옵션으로 설정한다.
- 사용법 예시
- timeout
- 지정한 시간 내에 메소드 수행이 완료되지 않으면 rollback 한다.
- 옵션 값이 -1일 경우에는 timeout을 사용하지 않는다. (= no timeout)
- 사용법 예시
- readOnly
- 트랜잭션을 읽기 전용으로 설정한다.
- 기본값 : flase
- readonly = true 설정 시 insert, update, delete 실행 시 예외 발생
- 사용법 예시