✏️스프링 컨테이너의 기본 전략
스프링 컨테이너의 기본 전략은 트랜잭션 범위의 영속성 컨텍스트 전략이다.
- 이 전략은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 것이다.
- 즉, 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다.
- 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다.
스프링 트랜잭션 AOP는 대상 메소드를 호출하기 직전에 트랜잭션을 시작하고, 대상 메소드가 정상 종료되면 트랜잭션을 커밋하면서 종료한다.
- 트랜잭션을 커밋하면 JPA는 먼저 영속성 컨텍스트를 플러시해서 변경 내용을 데이터베이스에 반영한 후에 데이터베이스 트랜잭션을 커밋한다.
-> 영속성 컨텍스트의 변경 내용이 데이터베이스에 정상 반영 된다.
- 예외가 발생하면 트랜잭션을 롤백하고 종료하며, 이때는 플러시를 호출하지 않는다.
✏️트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다.
- 다양한 위치에서 엔티티 매니저를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용한다.
✏️트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다.
- 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다른다.
- 스프링 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당한다.
- 같은 엔티티 매니저를 호출해도 접근하는 영속성 컨텍스트가 다르므로 멀티스레드 상황에 안전하다.