반응형
아 글 수정 하려다가 실수로 지워버려서 복구할 방법이 없어서 다시 작성하게 된다 ㅡㅡ
짜증나지만 어쩌겠나..
@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 실습
위 코드 대로라면 A1Tx는 성공 B1Tx는 id의 키값 중복으로 insert에 실패해야한다 B1Tx는 커밋되지 않고 A1은 커밋되야함
강의 내용의 코드와 다른데, 강의 내용에서 진행 했던 코드에는 같은 클래스에 속한 메서드끼리 호출(내부 호출) 이라서
프록시 방식의 AOP는 내부호출인 경우 Advice가 적용되지 않아서 Tx가 적용되지 않는 현상이 있었다
그래서 두 메서드를 따로 별도의 클래스로 분리하여 실습을 진행해야 했음
코드대로 A1Tx이 처음 호출되고 B1Tx가 작업을 마친 후 A1Tx을 마무리함
기대한대로 A1에는 커밋됐고, B1은 Tx가 작동하여 커밋이 아니라 롤백이 작동됨.
반대로도 해본다
A1은 실패하여 롤백 돼야하고 B1은 커밋돼야한다
반응형
'Spring' 카테고리의 다른 글
[스프링의 정석] 게시판 페이징 삽질 (0) | 2023.04.25 |
---|---|
[스프링의 정석] MyBatis, DAO작성 (0) | 2023.04.24 |
[스프링의 정석] AOP의 개념과 용어 (0) | 2023.04.21 |
[스프링의 정석] Transaction, Commit, Rollback (0) | 2023.04.21 |
[스프링의 정석] Spring DI 활용하기 / @annotation (0) | 2023.04.19 |