Transaction Propagation

hjkim·2023년 6월 16일
1

REQUIRED

Outer transaction과 inner transaction은 logical 상으로 각각 존재하나 physical 상으로는 하나의 트랜잭션으로 처리되도록 하는 옵션이다. transaction을 실행시킬 때 더 넓은 범위 혹은 이미 존재하는 transaction(outer transaction)이 존재하면 해당 transaction의 inner transaction으로 참여시킨다. 이미 있는 transaction에 참여하게 될 경우 outer transaction의 isolation level, timeout value, read-only flag와 같은 설정들이 inner transaction에 동일하게 적용된다.

Inner transaction에서 롤백이 발생하고 outer transaction은 롤백 없이 계속 진행되어야 하는 상황에는 inner transaction 단독으로 롤백되는 것이 아니라 outer transaction도 이를 인지하고 UnexpectedRollbackException을 발생시킨다.

if (isExistingTransaction()) {
    if (isValidateExistingTransaction()) {
        validateExisitingAndThrowExceptionIfNotValid();
    }
    return existing;
}
return createNewTransaction();

REQUIRES_NEW

항상 독립적인 physical transaction을 생성시키는 옵션이다. 롤백과 커밋이 각각 이루어지며 서로에게 영향을 미치지 않는다.

if (isExistingTransaction()) {
    suspend(existing);
    try {
        return createNewTransaction();
    } catch (exception) {
        resumeAfterBeginException();
        throw exception;
    }
}
return createNewTransaction();

NESTED

하나의 physical transaction과 다수의 savepoints(롤백으로 되돌아 갈 수 있는 포인트)를 사용한다. Outer transaction은 inner transaction에서 무슨 일이 일어나든 관계없이 physical transaction을 가질 수 있다. Innter transaction의 롤백은 save point(롤백이 될 수 있는 지점들)를 남기는 기능을 이용하여 이루어진다.
단, JDBC를 사용하는 경우에 한하여 이 설정을 지원한다.

if (!isNestedTransactionAllowed()) {
    throw Exception();
} else {
    if (useSavepointForNestedTransaction()) {
        createAndHoldSavepoint();
    } else {
        return createNewTransaction();
    }
}

그 외

  • MANDATORY : 이미 진행중인 Transaction(Outer Transaction)에 합류시킴. Outer Transaction이 없을 경우 예외 발생
  • SUPPORT : 이미 진행중인 Transaction이 존재한다면 해당 트랜잭션에 합류, 미존재 시 예외 발생 없이 새로운 Transaction 생성(Non-Transactional)
  • NOT_SUPPORT : 이미 진행중인 Transaction이 존재한다면 잠시 중지시키고 새로운 Transaction을 생성(Non-Transactional)
  • NEVER : 이미 진행중인 Transaction(Outer Transaction)이 무조건 없어야 함. 있을 경우 예외 발생

[참조] https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-propagation

profile
피드백은 언제나 환영입니다! :)

0개의 댓글