반응형
@Transactional 하위에 또 다른 @Transactional을 준다면?
REQUIRED is the default propagation. Spring checks if there is an active transaction, and if nothing exists, it creates a new one. Otherwise, the business logic appends to the currently active transaction:
propagation type의 기본 값이 REQUIRED라서 자식 트랜젝션은 부모 트랜젝션에 종속된다.
begin tran { ##부모 트랜잭션
begin tran ##자식 트랜젝션
commit tran
} commit tran
이때 자식 트랜젝션에 에러를 발생한다면?
begin tran { ##부모 트랜잭션
begin tran ##자식 트랜젝션
throw
} commit tran
>> 자식 트랜젝션이 롤백되고 부모 트랜젝션도 롤백될 것으로 보인다.
그럼 자식 트랜젝션에 PROPAGATION_REQUIRES_NEW를 지정한다면?
@Transactional(propagation = Propagation.REQUIRES_NEW)
begin tran { ##부모 트랜잭션
begin tran requires_new ##자식 트랜젝션
throw
} commit tran
부모 트랜잭션은 독립적인 자식 트랜잭션이 실행되면 일시정지되었다가 자식 트랜잭션이 종료(커밋 혹은 롤백) 되면 재개된다.
1 커넥션 - 1 트랜젝션이 성립하려면 사실 'suspended'라는 건 존재할 수 없다. 그런데 저기서 suspended라고 언급한 이유는 무엇인가?
관련 소스를 열여보니 트랜잭션 정보를 임시 보관할 때 suspend()라는 함수를 사용하여 TransactionManager의 현재 트랜잭션을 SuspendedResourcesHolder에 저장한 후 현재 트랜잭션을 초기화하고, 새로운 트랜잭션을 시작하게 처리하고 있다는 것을 확인할 수 있었다. 그리고 현재 트랜잭션이 끝나면 SuspendedResourceHolder에서 다시 기존 트랜잭션 정보 꺼내와서 현재 트랜잭션에 설정한다.
begin tran { ##부모 트랜잭션
begin tran requires_new ##자식 트랜젝션
throw
} commit tran
따라서 위와 같은 경우, 자식 트랜젝션은 사실 별개의 독립적인 트랜젝션이 되어 저장/작업을 하게되며, 익셉션을 날리면 자식은 영향을 받지 않고 부모는 익셉션을 받아 롤백된다.
+
728x90
반응형
'개발 > spring' 카테고리의 다른 글
[scheduled] @Schueduled와 캐시 (0) | 2022.05.30 |
---|---|
[spring-cache] 스프링 캐시 ehcache (0) | 2022.05.30 |
[db connection] mysql driver (0) | 2022.05.09 |
[spring-jpa] native query 삽질로그 (0) | 2022.05.06 |
[transaction] rollback works only for unchecked exception (0) | 2022.03.30 |