안녕세계

[Spring] Transaction Propagation 본문

[Spring] Transaction Propagation

Junhong Kim 2025. 2. 15. 22:00
728x90
반응형

Transaction Propagation

Transaction Propagation은 트랜잭션이 다른 트랜잭션을 호출할 때, 그 트랜잭션이 어떻게 전파될지를 정의하는 개념입니다. 즉, 하나의 트랜잭션이 다른 메서드나 서비스에서 실행되는 트랜잭션에 참여할지, 새로운 트랜잭션을 생성할지 등을 결정하는 것입니다. Propagation은 애플리케이션 내부에서 트랜잭션의 전파 방식을 관리하며, 이를 Spring의 트랜잭션 매니저가 제어합니다.

 

참고로, Transaction Propagation은 애플리케이션 단(예: Spring Framework)에서 제공하는 개념이며, DB 트랜잭션은 단일 connection에서 시작과 종료로 관리되기 때문에 DB 자체에는 Propagation이 존재하지 않습니다. DB는 단순히 트랜잭션의 시작과 종료(경계)만을 인지할 수 있습니다.

물리 트랜잭션과 논리 트랜잭션

물리 트랜잭션은 DB Connection 수준에서 실제로 관리되는 트랜잭션입니다. 즉, commit이나 rollback과 같은 DB 작업 단위에서 이루어지는 실제 트랜잭션을 의미합니다. 하나의 물리 트랜잭션은 하나의 DB Connection으로 관리되며, 보통 트랜잭션 시작 → DB 작업 → commit/rollback으로 끝나는 흐름을 따릅니다.

BEGIN TRANSACTION;

SELECT ..
SELECT ..
INSERT ..

COMMIT; -- 또는 ROLLBACK;

 

논리 트랜잭션은 Spring과 같은 프레임워크에서 Transaction Propagation을 통해 관리되는 논리적(추상적) 트랜잭션입니다. 여러 메서드 호출 간에 Propagation 설정으로 하나의 트랜잭션처럼 보이게 관리되지만, 실제로는 하나의 물리 트랜잭션을 여러 논리 트랜잭션이 공유할 수 있습니다. 즉, 논리 트랜잭션은 물리 트랜잭션 위에서 Spring이 관리하는 가상의 트랜잭션을 의미합니다.

 

다음으로, Spring의 7가지 Propagation 옵션 중 자주 사용되는 REQUIRED, REQUIRES_NEW, NESTED는 물리 트랜잭션과 논리 트랜잭션을 기반으로 살펴보고, 사용 빈도가 낮은 MANDATORY, NEVER, SUPPORTS, NOT_SUPPORTED는 간략히 알아봅니다.

 

REQUIRED (Spring의 default Propagation)

개념

  • 상위 트랜잭션이 없으면, 새로운 트랜잭션을 생성하고 실행된다.
  • 상위 트랜잭션이 있으면, 상위 트랜잭션에 합류한다.

REQUIRED

REQUIRES_NEW

개념

  • (상위 트랜잭션이 있더라도) 항상 새로운 트랜잭션을 생성한다.
  • 하위 트랜잭션이 시작되면, 상위 트랜잭션은 일시 정지된다. 이때, 상위 트랜잭션의 DB 커넥션을 끊는 것은 아니다.
    하위 트랜잭션이 commit 또는 rollback 되면 상위 트랜잭션이 다시 시작된다.
  • 하위 트랜잭션이 시작되면, 총 2개의 커넥션에 연결된다.
    이말은 즉, 트랜잭션 별로 commit, rollback이 각각 진행될 수 있음을 의미한다.

REQUIRES_NEW

NESTED

개념

  • 하나의 물리 트랜잭션 안에 save point를 설정(NESTED 트랜잭션이 시작될 때)하고, 부분 rollback 시 save point까지 되돌린다.
  • 물리 트랜잭션 범위 안에서 save point를 사용해서 일부만 rollback 할 수 있다. 즉, DB 레벨에서는 하나의 물리 트랜잭션만 사용하고, 논리적으로 분리된 중첩 트랜잭션을 save point로 구현한 것이다. NESTED 트랜잭션 안에서 에러가 발생하면, save point까지 rollback하고 그 이전 단계는 유지한다.
  • NESTED 트랜잭션을 여러번 호출해도 DB 관점에서는 하나의 물리 트랜잭션에서 save point만 변경된다. 즉, 물리 트랜잭션이 commit 될 때까지 하나의 범위로 묶인다.

NESTED

SQL save point 문법
- 설정: SAVE POINT
- 롤백: ROLLBACK TO SAVE POINT
- 해제: RELEASE SAVE POINT

MANDATORY

개념

  • 상위 트랜잭션 내에서 실행되어야 하며, 상위 트랜잭션이 없을 경우 예외가 발생한다.
    • 상위 트랜잭션이 있을 경우, 상위 트랜잭션에 합류한다.
    • 상위 트랜잭션이 없을 경우, 예외가 발생한다.

NEVER

개념

  • 항상 트랜잭션이 없이 실행되어야 한다.
    • 상위 트랜잭션이 있을 경우, 예외가 발생한다.
    • 상위 트랜잭션이 없을 경우, 새로운 트랜잭션을 생성하지 않고 트랜잭션 없이 실행된다.

SUPPORTS

개념

  • 상위 트랜잭션이 있을 경우, 상위 트랜잭션에 합류한다.
  • 상위 트랜잭션이 없을 경우, 새로운 트랜잭션을 생성하지 않고 트랜잭션 없이 실행된다.
    • REQUIRED와 반대되는 개념

NOT_SUPPORTED

개념

  • 상위 트랜잭션이 있을 경우, 상위 트랜잭션을 보류하고 트랜잭션 없이 실행된다.
    • REQUIRED와 반대되는 개념
  • 상위 트랜잭션이 없을 경우, 새로운 트랜잭션을 생성하지 않고 트랜잭션 없이 실행된다.
    • REQUIRED와 반대되는 개념

참고

728x90
반응형
Comments