본문 바로가기
Spring

[스프링의 정석] Transactional

by 리잼 2023. 4. 24.
반응형

아 글 수정 하려다가 실수로 지워버려서 복구할 방법이 없어서 다시 작성하게 된다 ㅡㅡ

짜증나지만 어쩌겠나..

 

@Transactional의 속성

속성 설명
propagation Tx의 경계(boundary)를 설정하는 방법을 지정
isolation Tx의 isolation level을 지정. Default, READ_UNCOMMITED,
READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
readOnly Tx이 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상
rollbackFor 지정된 예외가 발생하면, Tx을 rollback
RuntimeException과 Error는 자동 rollback
noRollbackFor 지정된 예외가 발생해도, Tx을 rollback하지 않음
timeout 지정된 시간(초) 내에 Tx이 종료되지 않으면, Tx를 강제 종료

@propagation의 속성 값

설명
REQUIERD Tx이 진행중이면 참여하고, 없으면 새로운 Tx시작 ( 디폴트 )
REQUIERS_NEW Tx이 진행중이건 아니건, 새로 Tx 시작
NESTED Txdl 진행중이면, Tx의 내부 Tx로 실행
MANDATORY 반드시 진행중인 Tx내에서만 실행가능. 아니면 예외 발생
SUPPORTS Tx이 진행중이건 아니건 상관없이 실행
NOT_SUPPORTED Tx없이 처리. Tx이 진행중이면 잠시 중단 ( suspend )
NEVER Tx없이 처리. Tx이 진행중이면 예외 발생

 

Transactional 실습

TxService.java

위 코드 대로라면 A1Tx는 성공 B1Tx는 id의 키값 중복으로 insert에 실패해야한다 B1Tx는 커밋되지 않고 A1은 커밋되야함

강의 내용의 코드와 다른데, 강의 내용에서 진행 했던 코드에는 같은 클래스에 속한 메서드끼리 호출(내부 호출) 이라서

이런식으로 내부호출을 하는 구조였다

프록시 방식의 AOP는 내부호출인 경우 Advice가 적용되지 않아서 Tx가 적용되지 않는 현상이 있었다

그래서 두 메서드를 따로 별도의 클래스로 분리하여 실습을 진행해야 했음

TxServiceTest.java
Transactional 주소

코드대로 A1Tx이 처음 호출되고 B1Tx가 작업을 마친 후 A1Tx을 마무리함

 

실행 결과

기대한대로 A1에는 커밋됐고, B1은 Tx가 작동하여 커밋이 아니라 롤백이 작동됨.

반대로도 해본다

A1은 실패하여 롤백 돼야하고 B1은 커밋돼야한다 

실행 결과

 

반응형