1. 영속성 컨텍스트란?
- 엔티티를 영속적으로 저장하는 환경
- JPA에서는 엔티티의 생명주기를 관리하고, 애플리케이션과 데이터베이스 사이에서 수많은 최적화 작업을 해주는 논리적인 공간(메모리 공간)
2. 영속성 컨텍스트를 사용하는 이유
- 1차 캐시와 동일성 보장
- 영속성 컨텍스트는 일종의 Map형태의 캐시 저장소를 가짐
- 1차 캐시에 엔티티가 저장
- 1차 캐시에 동일한 ID 엔티티 객체가 있을 경우 DB를 조회하지 않고 반환
- 변경 감지 (Dirty Checking)
- 트랜잭션이 커밋되기 직전, 영속성 컨텍스트는 1차 캐시에 있는 모든 엔티티의 최초 상태(스냅샷)와 현재 상태를 비교
- 엔티티의 필드값이 변경되었을 경우, JPA는 변경된 내용을 감지하고 자동으로
UPDATE SQL을 생성하여 DB에 반영
- 쓰기 지연 (Transactional Write-Behind)
- 호출 즉시 SQL이 DB로 전송되는 것이 아닌 1차 캐시에 저장됨
- 커밋되는 순간, JPA가 모아둔 모든 SQL을 한 번에 DB로 전송(Flush)
3. 트랜잭션 격리 수준 (Transaction Isolation Level)
- 동시에 실행되는 여러 트랜잭션들이 어느 정도 격리되어 실행될지를 결정하는 DB설정
- READ UNCOMMITTED
- 가장 낮은 격리 수준
- 다른 트랜잭션에서 값을 읽을 수 있음, 정합성에 문제가 많아 사용하지 않는 것을 권장
- READ COMMITTED
- COMMIT이 된 데이터만 읽음
- RDB에서 대부분 기본적으로 사용하는 격리 수준
- REPEATABLE READ
- 자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT이 된 데이터만 읽음
- MySQL의 default 격리 수준
- MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 됨
- SERIALIZABLE
- 가장 엄격한 격리 수준
- 데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회
- 성능 문제로 데이터베이스에서 거의 사용되지 않음