반응형
🔍데이터베이스 격리 수준(Isolation Level) 이란?
- 트랜잭션에서 일관성 없는 데이터를 허용하는 수준
🔍DB 격리 수준 종류
- Read Uncommitted
- Read Commited
- Repeatable Read
- Serializable
Read Uncommitted -> Serializable 로 갈수록 격리 수준이 높다.(high)
Serializable -> Read Uncommitted 로 갈수록 격리 수준이 낮다.(low)
Read Uncommitted | SELECT 문장 수행 시 해당 데이터에 Shared Lock이 걸리지 않는 수준. 아직 커밋되지 않은 트랜잭션 A의 데이터를 B가 SELECT할 수 있음. |
Read Commited | SELECT 문장이 수행되는 동안 데이터에 Shared Lock이 걸림. 아직 커밋되지 않은 트랜잭션 A의 데이터를 B가 SELECT할 수 없음. |
Repeatable Read | 트랜잭션 A가 시작되기 전에 커밋된 내용까지만 조회 가능. 자신의 트랜잭션보다 낮은 트랜잭션에서 커밋된 것만 읽는다. |
Serializable | 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당되는 영역에 대한 수정 및 입력 불가. 완벽한 LOCK을 건다. |
🔍스프링부트의 전통적인 트랜잭션
- 세션의 시작은 서블릿이 시작되는 시점부터 (세션은 영속성 컨텍스트를 포함한다.)
- 트랜잭션의 시작은 서비스 레이어부터, JDBC 커넥션 또한 이 시점부터.
- 트랜잭션의 종료는 서비스 계층에서 종료, JDBC 커넥션 또한 이 시점부터 종료.
- 세션은 컨트롤러 영역까지 끌고가기 때문에 영속성이 보장되어 SELECT가 가능해짐.
🔍스프링 JPA의 OSIV 전략?
- OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어두는 기능임.
- 영속성 컨텍스트가 유지될 경우 엔티티도 영속 상태로 유지됨.
- JPA에서는 OEIV(Open EntityManager In View), Hibernate에서는 OSIV라고 부른다.
🔍OSIV 동작 원리
스프링프레임워크 OSIV는 비즈니스 계층에서 트랜잭션을 사용하는 OSIV임. 영속성 컨텍스트는 사용자의 요청 시점에 생성되지만 데이터를 쓰거나 수정할 수 있는 트랜잭션은 비즈니스 계층에서만 사용하도록 트랜잭션이 일어난다.
- 클라이언트 요청이 들어오면 서블릿 필터 or 스프링 인터셉터에서 영속성 컨텍스트를 생성하는데 이 시점에서 트랜잭션은 시작하지 않음!
- 서비스 계층에서 @Transeactional로 트랜잭션을 시작 시 위에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작함.
- 서비스 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시함. -> 이 시점에 트랜잭션은 종료되지만 영속성 컨텍스트는 종료되지 않음.
- 컨트롤러, 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지하게 됨.
- 서블릿 필터 or 스프링 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료, 이때 플러시를 호출하는 것이 아니라 바로 종료하게 됨.
반응형
'💻 my code archive > 🏷️JAVA & Spring(Boot)' 카테고리의 다른 글
스프링부트 공부기록(21) - 방명록 작성 :: 게시물 등록, 페이징 처리 구현하기 (0) | 2022.03.18 |
---|---|
[스프링부트 블로그 만들기] 시큐리티 적용X, 전통적인 방식 로그인 구현하기 (0) | 2022.03.17 |
[스프링부트 블로그 만들기] ajax 통신, 회원가입 구현하기 (0) | 2022.03.17 |
[스프링부트 블로그 만들기] 부트스트랩 적용하여 메인 화면 구현하기 (0) | 2022.03.17 |
[스프링부트 블로그 만들기] 테이블 생성하고 CRUD 테스트 하기 (0) | 2022.03.17 |