[스프링부트 블로그 만들기] DB 격리 수준, 스프링부트 트랜잭션, JPA OSIV란?
my code archive
article thumbnail
반응형

🔍데이터베이스 격리 수준(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 스프링 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료, 이때 플러시를 호출하는 것이 아니라 바로 종료하게 됨.
반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형