Spring이 제공하는 선언전 트랜잭션의 장점 중 하나는 여러 트랜잭션을 묶어서 커다란 하나의 트랜잭션 경계를 만들 수 있다는 점이다.
"이미 트랜잭션이 진행 중일때, 추가 트랜잭션 진행을 어케 할지 결정하는 것이다."
이렇게 하나의 트랜잭션이 다른 트랜잭션을 만나는 상황을 그림으로 나타내면 아래와 같다.

트랜잭션은 데이터베이스에서 제공하는 기술로 "커넥션 객체"를 통해 처리가 된다. 1개의 트랜잭션을 사용한다는 것은 하나의 커넥션 객체를 사용한다는 것이며, 실제 데이터베이스의 트랜잭션을 사용한다는 점에서 물리 트랜잭션이라고 한다.
트랜잭션 전파 속성에 따라 "외부 트랜잭션", "내부 트랜잭션"이 동일한 트랜잭션을 사용할 수도 있다. 하지만 스프링 입장에서는 트랜잭션 매니저를 통해 트랜잭션을 처리하는 곳이 2군데이다. 그래서 실제의 데이터베이스 트랜잭션과 스프링이 처리하는 트랜잭션 영역을 구분하기 위해 스프링은 논리 트랜잭션이라는 개념을 추가했다. 아래와 같이 외부트랜잭션과 내부 트랜잭션이 1개의 물리 트랜잭션(커넥션)을 사용하는 경우이다.

이 경우 2개의 트랜잭션 범위가 존재하기 때문에 개별의 논리 트랜잭션이 존재는 하지만, 실제로는 1개의 물리 트랜잭션이 사용되게 된다. 만약 트랜잭션 전파 없이 1개의 트랜잭션만 사용된다면 물리 트랜잭션만 존재하고, 트랜잭션 전파가 사용될 때, 논리 트랜잭션 개념이 사용된다.
- 물리 트랜잭션 : 실제 데이터베이스에 적용되는 트랜잭션으로, 커넥션을 통해 커밋/롤백되는 단위
- 논리 트랜잭션 : 스프링이 트랜잭션 매니저를 통해 트랜잭션을 처리하는 단위
기존의 트랜잭션이 진행 중일때, 또 다른 트랜잭션이 사용되면 복잡한 상황이 발생을 한다. 스프링은 논리 트랜잭션이라는 개념을 도입한다.
- 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋.
- 하나의 논리 트랜잭션이라도 롤백이 되면 물리 트랜잭션은 롤백.
논리 트랜잭션을 기반으로 단순한 원칙을 세움으로 써, 2개 이상의 트랜잭션을 다루는 것이 쉬워졌따. 실제 트랜잭션들이 마주하는 상황에서 어떤 전파 속성들이 있는지 알아보자.
REQUIRED는 스프링이 제공하는 기본적인 전파 속성으로, 기본적으로 2개의 논리 트랜잭션을 묶어 1개의 물리 트랜잭션을 사용하는 것이다. 위에 내용들은 전부 해당 내용들이며, 내부 트랜잭션은 기존에 존재하는 외부 트랜잭션에 참여한다.

참여한다는 것은 외부트랜잭션을 그대로 이어간다는 의미로, 외부 트랜잭션의 범위가 내부 트랜잭션까지 확장되는 것이다. 그렇기에 내부 트랜잭션은 새로운 물리 트랜잭션을 만드는 것이 아니다.
트랜잭션 매니저에 의해 관리되는 논리 트랜잭션이 존재하므로 커밋은 내부 1회, 외부 1회로 총 2회가 일어난다.
내부 트랜잭션은 논리 트랜잭션이므로, 커밋을 호출해도 즉시 커밋x, 물리 트랜잭션을 관리하는 외부 트랜잭션이 최종적으로 커밋될 때 실제로 커밋이 된다. 롤백 또한, 내부 트랜잭션에서 롤백을 하여도 즉시 롤백되지는 않는다. 물리 트랜잭션이 롤백될 때 실제 롤백이 처리되는데, 논리 트랜잭션들 중에서 1개라도 롤백되엇다면 롤백이 된다.
허나, 외부 트랜잭션에서 롤백되는지와 내부 트랜잭션에서 롤백되는지에는 동작 방식에 차이가 존재한다.
로직1에서 예외가 발생하여 외부 트랜잭션ㅇ의 롤백이 필요한 경우 내부 트랜잭션의 여부와 상관없이 물리트랜잭션에서 롤백을 시키게 된다. 마찬가지 로직 1은 커밋하고, 로직2에서 롤백이 되면 똑같이 물리트랜잭션에서 롤백이 된다는 결과는 동일이다.
하지만, 실제로 물리 트랜잭션을 관리하는 외부 트랜잭션에서는 커밋을 기대하나 내부 트랜잭션에서는 롤백을 원하기에, 외부 트랜잭션이자 물리 트랜잭션에서는 예기치 못한 상황이라고 본다. 따라서 내부 트랜잭션에서는 UnexpectedRollbackException 예외를 발생시켜 롤백 필요성을 알리고, 외부 트랜잭션에서는 이를 바탕으로 롤백을 진행한다.
REQUIRES_NEW는 외부 트랜잭션과 내부 트랜잭션을 완전히 분리하는 전파 속성이다. 따라서 2개의 물리 트랜잭션이 사용되며, 각각 트랜잭션 별로 커밋과 롤백이 수행된다.

두 개는 서로 다른 물리 트랜잭션으로, 내부 트랜잭션 롤백이 외부 트랜잭션 롤백에 영향을 주지않는다. 그러므로 내부 트랜잭션이 롤백 호출은 실제 커넥션에 롤백을 호출하는 것이므로 트랜잭션이 끝나게 된다.
서로 다른 물리 트랜잭션을 별도로 가진다는 것은 각각의 DB 커넥션이 사용된다는 것이다. 즉, 1개의 HTTP 요청에 2개의 커넥션이 사용되는 것이다. 내부 트랜잭션이 처리 중일때는 꺼내진 외부 트랜잭션이 대기하는데, 이는 데이터베이스 커넥션을 고갈시킬 수 있다. 그러므로 조심해서 사용해야 하며, 만약 REQURES_NEW 없이 해결 가능하다면 대안책(별도의 클래스를 두기 등)을 사용하는 것이 좋다.