@Transactional

이규훈·2022년 11월 18일
0

스프링 정리

목록 보기
21/30

@Transactional의 속성

속성설명
propagationTx의 경계를 설정하는 방법을 지정
isolationTx의 isolation level을 지정.
readOnlyTx가 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상
rollbackFor지정된 예외가 발생하면, Tx을 rollback한다. RuntimeExceoption과 Error는 자동 rollback한다.
noRollbackFor지정된 예외가 발생해도, Tx을 rollback하지 않음
timeout지정된 시가(초) 내에 Tx가 종료되지 않으면, Tx를 강제 종료

propagation 속성의 값

설명
REQUIREDTx가 진행중이면 참여하고, 없으면 새로운 Tx 시작(디폴트)
REQUIRES_NEWTx이 진행중이건 아니건, 새로 Tx 시작
NESTEDTx가 진행 중이면, Tx의 내부 Tx로 실행
MANADATORY반드시 진행중인 Tx내에서만 실행가능. 아니면 예외발생
SUPPORTSTx가 진행중기너 아니건 상관없이 실행
NOT_SUSPENDTx없이 처리. Tx가 진행중이면 잠시 중단(suspend)
NEVERTx없이 처리. Tx가 진행중이면 예외 발생

REQUIRED, REQUIRES_NEW가 중요함

REQUIRES_NEW, NESTED 차이점

REQUIRES_NEW는 Tx안에 다른 Tx 즉 서로 다른것
NESTED는 Tx안에 subTx가 있다. -> 같은 Tx


REQUIRED 와 REQUIRES_NEW

REQUIRED

A1 - B1 - B2 - A2 순서이다.
만약 REQUIRED가 있고 Tx가 기존에 있으면 새로 Tx 안만듬
만약 Tx1 시작했을때 B1,B2에 대한 트렌젝션이 만들어지지 않고 바로 하나인 것처럼 간다는 뜻이다. 만약 B2에서 에러가 발생하면 A1까지 Rollback이 된다.

둘다 REQUIRED마치 하나인 것처럼 돌아간다.
2번째가 REQUIRED인지 무엇인지가 중요하다.

기존 것이 있으면 굳이 만들지 않는 것이다.

REQUIRES_NEW

위의 사진과 비교하면 차이를 알 수 있다. 새로운 Tx가 필요하다는 뜻이다. 여기서 만약 B2에서 에러가 발생해서 Rollback하면 B1으로 돌아가는 것이다.
ex)
A1 - 성공
B1 - 성공
B2 - 성공
A2 - 에러
이 경우에는 A1으로 rollback이 된다. 그러면 B1,B2는 commit이 된다. 왜냐하면 다른 트렌젝션이기 때문이다.
위하고 다른 것을 알아두자.

profile
개발취준생

0개의 댓글

관련 채용 정보