본문 바로가기
스프링 부트

[스프링부트] 트랜잭션 격리 수준

by illlilillil 2022. 7. 13.

트랜잭션에서 격리 수준은 일관성 없는 데이터를 허용하도록 하는 수준을 말한다.

격리 수준에는 4가지 종류가 있다.

  1. READ_UNCOMMITED
  2. READ_COMMITED
  3. REPEATABLE_READ
  4. SERIALIZABLE\

숫자가 높아질수록 속도는 느려진다.

 

READ_UNCOMMITED

트랜잭션 처리 중인거나 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.

그러나 Dirty Read라는 문제가 발생한다. Dirty Read는 트랜잭션이 완료되지 않았는데 다른 트랜잭션에서 볼 수 있는 현상을 말한다.

 

READ_COMMITED

트랜잭션이 커밋된 데이터만 읽을 수 있다.

어떤 사용자가 A라는 데이터를 변경할때 다른 사용자는 접근할 수 없다.

그러나 Non-Repeatable Read 문제가 발생할 수 있다. 한 트랜잭션 내에서 같은 조회를 수행할 경우 항상 같은 결과를 반환해야 하는데 이 격리 수준은 그렇지 못하다.

 

REPEATABLE READ

트랜잭션이 시작되기 전, 커밋된 내용에 대해서만 조회할 수 있는 격리 수준이다. 다른 사용자는 해당 영역에 데이터 수정이 불가능하다.

그러나 Phantom Read 문제가 발생한다. 트랜잭션 내에서 같은 쿼리를 두 번 실행했는데, 첫 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상이다.

 

SERIALIZABLE

단순하고 엄격한 격리 수준이다. 읽기 작업에도 공유 잠금을 설정해 동시에 다른 트랜잭션이 수정을 하지 못하도록 한다.

댓글