흰 스타렉스에서 내가 내리지

트랜잭션 범위의 영속성 컨텍스트 본문

JPA

트랜잭션 범위의 영속성 컨텍스트

주씨. 2024. 4. 25. 19:03
728x90

스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.

이 말은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다.

 

트랜잭션을 시작할 떄 영속성 컨텍스트를 생성하고, 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다.

같은 트랜잭션 내에서는 항상 같은 영속성 컨텍스트에 접근한다.

 

즉, 1트랜잭션 1PC

 

 

-- --

 

보통 서비스 계층에 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다.

이 어노테이션이 있으면 호출한 메서드를 실행하기 직전에 스프링의 트랜잭션 AOP 가 먼저 동작한다.

 

 

# 흐름도 

트랜잭션 시작

⬇️

메서드 호출

⬇️

메서드 정상 종료

⬇️

Persistence Context flush

⬇️

DB 트랜잭션 커밋

--

 

만약 메서드에서 예외가 발생하면 트랜잭션을 롤백하고 종료하는데 이 때는 플러시를 호출하지 않는다.

 

 

▶️ 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다.

▶️ 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다.

  • 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다.
  • 스프링 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당한다. 
  • 따라서 같은 엔티티 매니저를 호출해도 접근하는 영속성 컨텍스트가 다르므로 멀티 스레드 상황에 안전하다.