트랜잭션에서 격리 수준은 일관성 없는 데이터를 허용하도록 하는 수준을 말한다.
격리 수준에는 4가지 종류가 있다.
- READ_UNCOMMITED
- READ_COMMITED
- REPEATABLE_READ
- SERIALIZABLE\
숫자가 높아질수록 속도는 느려진다.
READ_UNCOMMITED
트랜잭션 처리 중인거나 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
그러나 Dirty Read라는 문제가 발생한다. Dirty Read는 트랜잭션이 완료되지 않았는데 다른 트랜잭션에서 볼 수 있는 현상을 말한다.
READ_COMMITED
트랜잭션이 커밋된 데이터만 읽을 수 있다.
어떤 사용자가 A라는 데이터를 변경할때 다른 사용자는 접근할 수 없다.
그러나 Non-Repeatable Read 문제가 발생할 수 있다. 한 트랜잭션 내에서 같은 조회를 수행할 경우 항상 같은 결과를 반환해야 하는데 이 격리 수준은 그렇지 못하다.
REPEATABLE READ
트랜잭션이 시작되기 전, 커밋된 내용에 대해서만 조회할 수 있는 격리 수준이다. 다른 사용자는 해당 영역에 데이터 수정이 불가능하다.
그러나 Phantom Read 문제가 발생한다. 트랜잭션 내에서 같은 쿼리를 두 번 실행했는데, 첫 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상이다.
SERIALIZABLE
단순하고 엄격한 격리 수준이다. 읽기 작업에도 공유 잠금을 설정해 동시에 다른 트랜잭션이 수정을 하지 못하도록 한다.
'스프링 부트' 카테고리의 다른 글
[스프링] 재고 시스템으로 알아보는 동시성 문제 해결 방법 (0) | 2022.09.02 |
---|---|
[스프링] UserDetailsService를 여러 개 구현하고 잘 사용하기 (0) | 2022.08.25 |
[스프링부트] Event 발행과 @EventListener에 대해 알아보자 (0) | 2022.07.06 |
[스프링] Statement 대신 PreparedStatement를 사용해야 하는 이유 (0) | 2022.04.19 |
[인텔리제이] tdd 템플릿 만들기 (0) | 2022.04.11 |
댓글