빠에야는 개발중
@Transactinal 본문
무엇인가?
@Transactional 어노테이션은 스프링에서 제공하는 클래스, 메소드 레벨의 트랜잭션 지원 어노테이션이다. 이 어노테이션이 선언되면 스프링은 프록시 객체를 생성하여 자동 commit, rollback 등의 트랜잭션 처리를 맡긴다. 클래스, 메소드 내에서 Persistence layer에 접근하여 데이터를 조작, 조회 할 때 사용한다. 주로 Service layer에서 사용하게된다.
트랜잭션 격리 수준
트랜잭션 어노테이션답게 트랜잭션의 기능들 중 하나인 격리 수준 속성을 가지고 있다.
- Default
- 기본 격리 수준(DB의 격리 수준을 따름)
- READ_UNCOMMITTED (Level 0)
- 커밋되지 않은 데이터 읽기 허용
- 변경 중인 데이터에 접근할 수 있다.
- Dirty read 문제가 발생할 수 있다.
- READ_COMMITTED (Level 1)
- 커밋된 데이터만 읽기 허용
- 변경 중인 데이터에 접근할 수 없다.
- Dirty read 문제를 방지하는 레벨
- REPEATABLE_READ (Level 2)
- 한 트랜잭션이 진행되는 동안 다른 트랜잭션이 해당 데이터를 수정할 수 없다.
- 결과적으로 다른 트랜잭션은 일관성 있는 데이터를 가져가게 된다.
- Non-repeatable read 문제를 방지하는 레벨
- SERIALIZABLE (Level 3)
- 한 트랜잭션이 진행되는 동안 다른 트랜잭션은 전혀 접근할 수 없다.
- 가장 강한 격리 수준이지만 성능이 크게 저하된다.
- Phantom read 문제를 방지하는 레벨
격리 수준이 올라갈수록 성능은 떨어진다.
@Transactional(isolation=Isolation.DEFAULT)
public void method () { ... }
트랜잭션 전파
어떤 트랜잭션 내에서 또 다른 트랜잭션을 호출하게 될 때 해당 트랜잭션의 동작을 제어할 수 있는 옵션이다.
-
REQUIRED
- 기본 속성. 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다.
-
SUPPORTS
- 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행하게 만든다.
-
REQUIRES_NEW
- 항상 새로운 트랜잭션을 시작한다.
- 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다.
-
MANDATORY
- REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다.
- 반면에 트랜잭션이 시작된 것이 없으면 새로 시작하는 대신 예외를 발생시킨다.
- 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.
-
NOT_SUPPORTED
- 트랜잭션을 사용하지 않게 한다.
- 이미 진행 중인 트랜잭션이 있으면 보류시킨다.
-
NEVER
- 트랜잭션을 사용하지 않도록 강제한다.
- 이미 진행 중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다.
-
NESTED
- 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
- 중첩된 트랜잭션은 먼저 시작된 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않는다.
@Transactional(propagation = Propagation.REQUIRED)
public void method () { ... }
Read Only
- 트랜잭션을 읽기 전용으로 설정한다.
- 내부에서 데이터 수정 작업(INSERT, UPDATE, DELETE)이 동작하면 예외를 발생한다.
@Transactional(readOnly = true) public void method () { ... }
트랜잭션 롤백 예외
특정한 예외를 지정하여 해당 예외가 발생했을 때 트랜잭션을 roll-back 시킬 수 있다.
// 해당 예외가 발생했을때 롤백
@Transactional(rollbackFor = Exception.class)
public void method () { ... }
// 해당 예외가 발생해도 롤백하지 않음
@Transactional(noRollbackFor = Exception.class)
public void method () { ... }
timeout
해당 트랜잭션에 시간 제한을 건다. 기본 값은 -1(제한 없음)이다. 단위는 초이다.
@Transactional(timeout = 10)
public void method () { ... }
참고/출처 : 갓대희의 작은공간 [ https://goddaehee.tistory.com/167 ]
'공부 > 스프링' 카테고리의 다른 글
롬복(lombok) (0) | 2018.02.26 |
---|---|
Controller의 String 리턴 (0) | 2018.02.05 |
스프링 퀵 스타트 : chap 5-2 (0) | 2018.02.05 |
스프링 퀵 스타트 : chap 5-1 (0) | 2018.02.04 |
스프링 퀵 스타트 : chap 4-2 (1) | 2018.02.01 |
Comments