반응형

@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

따라서 위와 같은 경우, 자식 트랜젝션은 사실 별개의 독립적인 트랜젝션이 되어 저장/작업을 하게되며, 익셉션을 날리면 자식은 영향을 받지 않고 부모는 익셉션을 받아 롤백된다.

+

https://jobc.tistory.com/214

비슷한 글: https://woodcock.tistory.com/40

728x90
반응형

+ Recent posts