[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read

2024. 3. 19. 23:15·Database

트랜잭션?


트랜잭션은 하나의 데이터 교환 또는 변경을 안전하게 처리하도록 보장해 주는 것을 의미한다. 한 번의 애플리케이션 로직으로 인해 두 개 이상의 데이터가 영향을 받는 경우, 각각의 데이터에 대한 변경이 완전하게 끝난 후 데이터베이스에 정상적으로 반영하는 것이다. 만약 데이터 처리 중 문제가 발생 시 로직 실행 전으로 되돌리는 기능을 지원한다.

 

트랜잭션에 대해 모르신다면 아래 글을 읽어보시길 바랍니다.
📁[Database] 트랜잭션의 동작 원리와 ACID 속성

 

트랜잭션 격리성 ( Transaction Isolation )


트랜잭션의 격리성은 트랜잭션의 여러 특징들 중 하나이다.

격리성은 실행 중인 트랜잭션의 중간에 다른 트랜잭션이 접근할 수 없도록 하는 것을 뜻한다.

이런 격리성의 수준을 조절할 수 있고, DB에 따라 설정이 가능하며, Spring 어노테이션을 통해서도 설정할 수 있다.

 

이러한 격리성으로 인해 Dirty Read, Non-Repetable Read, Phantom Read의 문제점이 발생할 수 있다.

 


여러 트랜잭션이 동시에 적용될 때 생기는 문제


1. Dirty Read

다른 트랜잭션에 의해 수정되었지만, 아직 커밋되지 않은 상태의 데이터를 읽는 것을 말한다.

 

아래 그림에서 트랜잭션 1에서 data2를 insert 하고,

커밋하지 않은 상태에서 트랜잭션 2가 아직 커밋되지 않은 data2를 읽었다.

해당 data2는 커밋될지, 롤백될지 알 수 없다.

Dirty Read


2. Non-Repeatable Read

하나의 트랜잭션에서 같은 키를 가진 데이터를 두 번 읽을 때, 그 결과가 다르게 나타나는 현상이다.

 

첫번째 Read와 두 번째 Read 사이에 다른 트랜잭션에서 값을 변경하거나 삭제하면 그 결과가 다르게 나타날 수 있다.

따라서 트랜잭션의 일관성을 해치는 문제가 발생한다.

Non-Repeatable Read

그림에서 트랜잭션1은 key=2인 데이터를 두 번 읽는다.

그러나 select1와 select2 사이에 해당 데이터가 수정되었다.

따라서 select1의 결과와 select2의 결과가 달라지게 된다.


3. Phantom Read

Non-Repeatable Read와 유사하지만, 여러 개의 데이터를 조회할 때 발생한다는 점이 다르다.

일정 범위의 데이터를 2번(여러번) 읽을 때,

첫 번째 쿼리에 없던 유령(Phantom) 데이터가 두 번째 쿼리에서는 나타나는 현상이다.

 

아래 그림에서 트랜잭션 1은 key=1~3의 데이터를 두 번 조회한다.

트랜잭션 2에서 Select1과 Select2 사이의 시점에 data3을 저장하고 커밋하였다.

Select1에서는 두개의 데이터가 조회되고, Select2에서는 세개의 데이터가 조회되었다.

Phantom Read

위의 격리성 관련 설정을 Spring에서 @Transactional 어노테이션 세부 설정을 통해 제어할 수 있다.

아래 글에서 해당 설명을 확인할 수 있습니다.
📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정

 


트랜잭션 관련 글

📁[Database] 트랜잭션의 동작 원리와 ACID 속성

📁[Database] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정

📁[Java, Spring] 트랜잭션을 적용하는 여러가지 방법

📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정

📁[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read


(참고) 인프런 - 김영한 님 스프링 DB 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1#
반응형
저작자표시 (새창열림)

'Database' 카테고리의 다른 글

[Database / SQLD] 데이터 모델과 SQL _ 정규화, 반정규화, 트랜잭션 (Part1 - Ch02)  (0) 2024.04.24
[Database / SQLD] 데이터 모델링의 이해 (Part1 - Ch01)  (0) 2024.04.19
[DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정  (0) 2024.03.19
[Database] 트랜잭션의 동작 원리와 ACID 속성  (0) 2024.03.19
[DB / SQL] DB Join 조인 (left join / right join / inner join / outer join)  (0) 2024.02.22
'Database' 카테고리의 다른 글
  • [Database / SQLD] 데이터 모델과 SQL _ 정규화, 반정규화, 트랜잭션 (Part1 - Ch02)
  • [Database / SQLD] 데이터 모델링의 이해 (Part1 - Ch01)
  • [DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정
  • [Database] 트랜잭션의 동작 원리와 ACID 속성
HSRyuuu
HSRyuuu
Web Server Developer hsryuuu
  • HSRyuuu
    HS_dev_log
    HSRyuuu
  • 전체
    오늘
    어제
  • 링크

    • Github
    • 전체 글 보기 (248) N
      • AI (5) N
      • Spring (37)
      • Infra & DevOps (20)
      • Java (25)
      • Database (28)
      • Web & Network (14)
      • 자료구조 & 알고리즘 (30)
      • Computer Science (24)
      • Frontend (17)
        • Vue.js & Nuxt.js (9)
        • JSP_Thymeleaf (7)
      • etc (48)
        • 오픈소스 라이브러리 (5)
        • 코딩테스트 (13)
        • Trouble Shooting (7)
        • Tech Interview (6)
        • Book Review (9)
        • 끄적끄적... (6)
        • 개인 프로젝트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    docker
    MySQL
    TechInterview
    백엔드공부
    백준
    리눅스
    자료구조
    JPA
    클린코드
    Java
    SpringBoot
    트랜잭션
    cleancode
    Spring
    SQL
    Nuxt3
    Linux
    백엔드
    백엔드스쿨
    기술면접
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
HSRyuuu
[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read
상단으로

티스토리툴바