트랜잭션의 격리수준

Karter·2022년 6월 18일
0

데이터베이스

목록 보기
8/8
post-thumbnail

격리수준의 필요성

  • 트랜잭션간에 격리성을 완벽히 보장하려면 동시에 처리되는 트랜잭션을 거의 차례대로 실행 해야 함. 하지만 이렇게 처리를 하면 처리 성능이 매우 나빠지게 된다.
  • 이러한 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의.
  • 트랜잭션 수준 읽기 일관성을 지키기 위해서이다. (다시말해 동시성 제어 문제 해결을 위해서)
    • 트랜잭션 수준 읽기 일관성
      트랜잭션이 시작된 시점으로부터 일관성 있게 데이터를 읽어 들이는 것을 말한다.
      하나의 트랜잭션이 진행되는 동안 다른 트랜잭션에의해 변경사항이 발생하더라도 이를 무시하고 계속 일관성 있는 데이터를 보여준다. (물론 트랜잭션 자신이 발생한 변경사항은 읽을 수 있다)

트랜잭션의 격리수준

  • 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.
  • READ UNCOMMITTED : 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다
  • READ COMMITTED : 다른 트랜잭션에서 커밋되 내용만 참조할 수 있다.
  • REPETABLE READ : 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
  • SERIALIZABLE : 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다. (성능이 매우 떨어짐)

READ UNCOMMITTED (트랜잭션 레벨 0)

  • READ UNCOMMITTED 격리 수준에서는 위 그림처럼 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 보여지게 된다.
  • 더티 리드가 허용되는 격리 수준이 READ UNCOMMITTED.
  • 최소 READ COMMITTED 이상의 격리 수준을 사용할 것을 권장

더티 리드(Dirty Read)

  • 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상
  • 더티 리드 현상은 데이터가 나타났다가 사라졌다 하는 현상을 초래할 수 있으므로 개발자와 사용자를 상당히 혼란

READ COMMITTED (트랜잭션 레벨 1)

  • 온라인 서비스에서 가장 많이 선택되는 격리 수준.
  • 어떠한 트랜잭션에서 데이터를 변경하더라도 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있기 때문에 더티 리드(Dirty Read)와 같은 현상은 발생하지 않는다.
  • UNDO영역에서 데이터를 읽어온다.
  • NON-REPEATABLE READ가 발생할 수 있다.

NON-REPEATABLE READ

  • 사용자 B가 하나의 트랜잭션내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 "REPEATABLE READ" 정합성에 어긋나게 된다.

REPEATABLE READ (트랜잭션 레벨 2)

  • NON-REPEATABLE READ" 부정합이 발생하지 않는다.
  • B의 10번 트랜잭션 안에서 실행되는 모든 SELECT 쿼리는 자신의 트랜잭션인 10번 보다 작은 트랜잭션 번호에서 변경한 것만 보게된다.
  • 하나의 레코드에 대해 백업이 하나 이상 얼마든지 존재할 수 있다.
  • 만약 한 사용자가 트랜잭션을 시작한 후 장시간동안 트랜잭션을 종료하지 않으면 언두 영역이 백업된 데이터로 무한정 커질 수 있고, 이렇게 언두 영역에 백업된 레코드가 많아질수록 MySQL 서버의 처리 성능이 떨어질 수 있다.
  • PHANTOM READ(PHANTOM ROW) 발생할 수 있다.

PHANTOM READ(PHANTOM ROW)

SERIALIZABLE (트랜잭션 레벨 3)

  • 가장 단순한 격리 수준이면서 가장 엄격한 격리 수준.
  • 또한 동시 처리 성능도 다른 트랜잭션 격리 수준보다 현저히 떨어진다.
  • 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없다.

격리 수준에 따라 발생할 수 있는 문제점

  • DIRTY READ: 어떠한 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상
  • NON-REPEATABLE READ: 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 "REPEATABLE READ" 정합성에 어긋나는 현상
  • PHANTOM READ: 한 트랜잭션내에서 동일한 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 존재하지 않던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상
profile
미래 최고의 개발자

0개의 댓글