@Transactional 은 어떻게 동작할까?
강대명(charsyam@naver.com)
강대명 소개
@Transactional 은 어떻게 동작할까?
4가지 없는 샘플
| 1 | 2 | 3 | 4 |
@Transactional Annotation | False | False | True | True |
Exception | False | True | False | True |
비고 | 그대로 저장 | 그대로 저장 | 그대로 저장 | Rollback |
4가지 없는 샘플…(엉?)
@Transactional Annotation이 있으면
Exception 이 발생하면 자동으로 rollback 이 된다!!!
AOP의 마법…
@Transactional 이 없는 경우
@Transactional 이 없을때 생기는 Call Stack
CglibAopProxy 가 호출된다.
@Transactional 이 있는 경우
@Transactional Annotation 을 이용했을 때 생기는 Call Stack
똑같이 CglibAopProxy 가 호출된다.
추가로 TransactionInterceptor 가 호출된다.
TransactionInterceptor #1
TransactionInterceptor #2 - ReactiveTransactionManager
TransactionInterceptor #4
실제 주요 Proxy 코드
여기서 주의!!!
Proxy 코드는 외부에서 해당 Annotation 이 있는 메서드를 호출할 때 생성된다.
내부에서 호출 하는 경우 #1
내부에서 호출 하는 경우 #2
Proxy 가 어떻게 호출하는지 모르면…
Transaction이 Rollback 안되는 경우가 발생할 수
있다. 딴 것들도 마찬가지!!!
@Transactional 쓸 때 주의할 것
One More Thing
try-catch 로 exception을 잡아도
rollback 될 수 있다.
새로운 케이스
새로운 @transactional 의 호출
새로운 @transactional 의 호출
Reference
감사합니다.