Spring/공부

@Transactional propagation

호 두 2022. 10. 27. 15:15
반응형

 

1. propagation
트랜잭션 전파를 위한 설정이다. 트랜잭션 동작을 설정하는 데 매우 중요한 속성이다.
  - REQUIRED (default) — 이미 진행 중인 트랜잭션이 없으면 새로 시작하고, 진행 중인 트랜잭션이 있다면 기존 트랜잭션에 참여한다.
  - REQUIRES_NEW — 항상 새로운 트랜잭션을 시작한다.
  - MANDATORY — 이미 진행 중인 트랜잭션이 없으면 예외를 발생시키고, 진행 중인 트랜잭션이 있다면 기존 트랜잭션에 참여한다.
  - NESTED — 이미 진행 중인 트랜잭션(부모 트랜잭션)이 없으면 새로운 트랜잭션을 생성하고, 진행 중인 트랜잭션(부모 트랜잭션)이 있다면 중첩 트랜잭션을 만든다. (부모의 commit/rollback은 중첩에 영향을 주지만, 중첩은 부모에 영향 x)
  - NEVER - 트랜잭션을 사용하지 않는다. 트랜잭션이 존재하면 예외를 발생시킨다.
  - SUPPORTS — 진행 중인 트랜잭션이 있다면 기존 트랜잭션에 참여한다. 없을 경우 트랜잭션 없이 실행한다.


예시)
트랜잭션 전파는 임의의 한 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 존재할 때, 혹은 존재하지 않을 때 동작 방식을 결정하는 설정이다.
A라는 트랜잭션이 시작되고, 트랜잭션 A가 끝나지 않은 시점에서 트랜잭션 B 메소드가 호출된다고 가정해 보자. 

그렇다면, B는 어느 트랜잭션에서 동작해야 할까? (B에 propagation이 적용되어 있을 경우)

*A 트랜잭션과 B 트랜잭션은 서로 다른 Service 레이어에 속해야 한다.
  1) A와 B 전체가 롤백
    - A라는 트랜잭션이 시작되었고 아직 진행 중이라면, B의 코드는 새로운 트랜잭션을 만들지 않고 A에서 시작된 트랜잭션에 참여할 수 있다. 이러한 경우, B를 호출한 b.method() 까지 마치고 이후 작업에서 예외가 발생한다면 A와 B가 모두 A의 트랜잭션에 하나로 묶여 있으므로 전체가 롤백될 것이다.
  2) A만 롤백 or B만 롤백
    - 트랜잭션 B가 트랜잭션 A와 별도의 트랜잭션을 만들 수 있다. 이 경우, 트랜잭션 B 경계를 빠져 나가는 순간, B 트랜잭션은 독립적으로 커밋되거나 롤백된다. 트랜잭션 A는 그 영향을 받지 않고 진행될 것이다. A의 (2)에서 예외가 발생하더라도 트랜잭션 A만 롤백되고, 트랜잭션 B에는 아무런 영향이 없을 것이다.

  - REQUIRED (default) — A 하나의 트랜잭션만 존재 (기본적이고 가장 많이 사용)
  - REQUIRES_NEW — A와 B, 2개의 트랜잭션이 존재 (독립적인 트랜잭션이 보장되어야 하는 코드에 적용)
  - MANDATORY — A 하나의 트랜잭션만 존재, 그렇지 않을 경우 예외를 발생 (독립적인 트랜잭션을 생성하면 안되는 경우에 사용)
  - NESTED — A와 B, 2개의 트랜잭션이 존재. or (REQUIRED와 마찬가지로 부모 트랜잭션이 존재하지 않으면 독립적으로 트랜잭션을 생성해서 사용한다.)
  - NEVER - 트랜잭션 존재 x. 트랜잭션이 존재하면 예외를 발생시킨다
  - SUPPORTS — A 하나의 트랜잭션만 존재

반응형