격리성 - Isolation 정면돌파 가보자잇

Kevin·2023년 7월 18일
2

Database

목록 보기
3/7
post-thumbnail

아래와 같은 시나리오를 구상 해 보도록 하자.

💡 J가 H에게 20만원을 이체할 때, 동시에 H도 ATM에서 본인 계좌에 30만원을 입금한다면

정상적인 FLOW

  • Transaction1(J가 H에게 20만원을 이체할 때)
    1. J의 계좌에 남아있는 잔액을 확인한다. (READ → 100만원)
    2. J의 계좌에서 20만원을 인출한 값을 다시 계좌에 적어준다. (WRITE → 80만원)
    3. H의 계좌에 남아있는 잔액을 확인한다. (READ → 200만원)
    4. H의 계좌에서 20만원을 입급받은 값을 다시 계좌에 적어준다. (WRITE → 220만원)
  • Transaction2(H도 ATM에서 본인 계좌에 30만원을 입금할 때)
    1. H의 계좌에 남아있는 잔액을 확인한다. (READ → 220만원)
    2. H의 계좌에서 30만원을 입급받은 값을 다시 계좌에 적어준다. (WRITE → 250만원)

비정상적인 FLOW

  • Transaction1(J가 H에게 20만원을 이체할 때)
    1. J의 계좌에 남아있는 잔액을 확인한다. (READ → 100만원)
    2. J의 계좌에서 20만원을 인출한 값을 다시 계좌에 적어준다. (WRITE → 80만원)
    3. H의 계좌에 남아있는 잔액을 확인한다. (READ → 200만원)
    • Transaction2(H도 ATM에서 본인 계좌에 30만원을 입금할 때)
      1. H의 계좌에 남아있는 잔액을 확인한다. (READ → 200만원)
      2. H의 계좌에서 20만원을 입급받은 값을 다시 계좌에 적어준다. (WRITE → 230만원)
    1. H의 계좌에서 20만원을 입급받은 값을 다시 계좌에 적어준다. (WRITE → 220만원) ← 문제 발생!!!

Transaction1에서는 Transaction2가 본인 트랜잭션 진행 중에서 시작되고, commit 되었기에 변경 사항을 알지 못하기에 이런 문제가 발생한다.

즉 여러 Transaction 들이 동시에 실행하니 문제가 발생한다.


이러한 문제를 해결하기 위해 Isolation이 등장하였다.

  • 여러 Transaction들이 동시에 실행될 때도 혼자 실행되는 것 처럼 동작하게 만든다.
    - 그러면 위의 경우에서 Transaction1이 Transaction2가 변경한 값들을 어떻게 동기화 시킬 수 있을까?
    - 내가 생각한 방법들
    1. Transaction2가 끝나는대로 기다렸다가 다시 값을 read 해온다. → 이 방식으로 동기화 시킨다.
    2. Transaction2의 값을 즉시 동기화한다.

  • DBMS는 여러 종류의 isolation level을 제공한다.

  • 개발자는 isolation level 중에 어떤 level로 transaction을 동작시킬지 설정할 수 있다.

  • concurrency control의 주된 목표가 isolation이다.


격리 수준

아래와 같은 격리 수준들이 있다.

  • READ UNCOMMITTED → 가장 낮은 격리 수준
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE → 가장 높은 격리 수준

격리 수준이 낮을 수록 더 많은 문제들이 발생하는데 문제들의 개념과 각각의 격리 수준에 생기는 문제들을 알아보자.


DIRTY READ란?

DIRTY READ

  • DIRTY READ는 커밋하지 않은 데이터를 읽을 수 있다는 뜻이다.
  • 예를 들어서 트랜잭션 1이 데이터를 수정하고 있는데 커밋하지 않아도, 트랜잭션 2가 트랜잭션 1이 수정중인 데이터에 접근해서 조회할 수 있는 것을 의미한다.
  • DIRTY READ를 허용하는 격리 수준을 READ UNCOMMITTED라고 한다.

NON-REPETABLE READ란?

NON-REPETABLE READ

  • NON-REPETABLE READ는 반복해서 같은 게이터를 읽을 수 없는 상태를 의미한다.
  • 예를 들어서 트랜잭션 1이 회원 A를 조회 중인데, 갑자기 트랜잭션 2가 회원 A의 예금을 수정하고 커밋하면, 다시 회원 A를 조회했을 때 수정된 데이터가 조회되는 경우를 의미한다.
  • DIRTY READ는 허용하지않지만, NON-REPETABLE READ를 허용하는 격리 수준을 READ COMMITED라고 한다.

PANTHOM READ란?

REPETABLE READ

  • PANTHOM READ란 반복 조회 시 결과 집합이 달라지는 것을 PHANOM READ라고 한다.
  • 예를 들어 트랜잭션 1이 money가 10,000원 이상인 회원들을 조회했는데, 트랜잭션 2가 money가 20,000인 회원을 하나 추가했으면, 트랜잭션 1이 다시 10살 이하의 회원을 조회했을 때 회원 하나가 추가된 상태로 조회된다.
  • NON-REPETABLE READ는 허용하지않지만, PANTHOM READ를 허용하는 격리 수준을 READ COMMITED라고 한다.

각각의 격리 수준에 생기는 문제들

  • READ UNCOMMITTED
    • 생기는 문제점 : DIRTY READ, NON-REPETABLE READ, PANTHOM READ
  • READ COMMITTED → 일반적인 데이터베이스에서 사용중인 격리 수준
    • 생기는 문제점 : NON-REPETABLE READ, PANTHOM READ
  • REPEATABLE READ
    • 생기는 문제점 : PANTHOM READ
  • SERIALIZABLE
    • 생기는 문제점은 없다.
profile
Hello, World! \n

3개의 댓글

comment-user-thumbnail
2023년 7월 18일

소중한 정보 잘 봤습니다!

답글 달기
comment-user-thumbnail
2023년 7월 18일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 19일

좋은 글 감사합니다!! 화이팅

답글 달기