
물리 트랜잭션 (Physical Transaction)
- 특정 데이터베이스 연결에 대한 실제 트랜잭션 경계를 의미한다.
- 데이터베이스 시스템에서 실제로 커밋 또는 롤백이 발생하는 단위다.
논리 트랜잭션 (Logical Transaction)
- 애플리케이션의 관점에서 보는 트랜잭션의 경계를 의미다.
- 하나의 물리 트랜잭션 내에서 여러 개의 논리 트랜잭션을 포함할 수 있다.
- 논리 트랜잭션은 개발자가 애플리케이션 로직 내에서 정의한 트랜잭션 경계로, 예를 들면, 여러 서비스 메서드 호출 등이 될 수 있다.
트랜잭션 핵심 원리
- 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋된다.
-> 하나의 논리 트랜잭션이라도 롤백되면 물리 트랜잭션은 롤백된다.
- 신규 트랜잭션만이 물리 트랜잭션을 종료(커밋,롤백)할 수 있다.
@Transactional(propagation = Propagation.REQUIRED)
- 이미 진행 중인 트랜잭션이 있을 경우, 그 트랜잭션에 참여한다 (즉, 현재의 물리 트랜잭션에 논리 트랜잭션이 묶인다).
- 진행 중인 트랜잭션이 없을 경우, 새로운 트랜잭션을 시작한다.
- @Transactional 어노테이션을 사용할 때 기본값으로 설정된다. (즉, 그냥 @Transactional 만 써도 됨)
@Transactional(propagation = Propagation.REQUIRES_NEW)
- 현재 진행 중인 트랜잭션이 있을 경우: 현재 진행 중인 트랜잭션을 일시 중단하고, 새로운 트랜잭션을 시작한다. 이렇게 해서 두 트랜잭션은 독립적으로 작동하게 된다. 일시 중단된 트랜잭션은 새로 시작된 트랜잭션이 종료된 후에 다시 재개된다.
- 현재 진행 중인 트랜잭션이 없을 경우: 새로운 트랜잭션을 시작한다.
- 특정 부분의 작업이 실패하더라도 전체 트랜잭션을 롤백하지 않고, 그 부분만 롤백할 수 있다.
- 별도의 트랜잭션으로 로깅 또는 오디팅을 수행할 수 있다.
정리
- 논리 트랜잭션이 하나라도 롤백되면 관련된 물리 트랜잭션은 롤백된다.
- REQUIRES_NEW 전파 타입을 사용해서 트랜잭션을 분리할 수 있다.
- 트랜잭션의 수만큼 DB 커넥션이 발생한다.