트랜잭션 격리 수준

Haribo·2022년 7월 17일
0

1일 1cs

목록 보기
8/9

먼저 트랜잭션이란?

https://velog.io/@wakeupmakeup/%ED%8A%B8%EB%9E%9C%EC%A0%9D%EC%85%98%EC%9D%B4-%EB%AD%94%EB%8D%B0%EC%9A%94

트랜잭션은 이곳을 참고하면 편하다.


격리수준 ⚠

격리수준이라는 것은 동시에 여러 트랜잭션이 일어날때 얼마나 서로 고립되어 있는지를 나타내는 것이다. 간단하게 정리하자면 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다.

격리 수준은 아래와 같이 4가지로 분류한다.

  • READ UNCOMMITTED (커밋되지 않은 읽기) (레벨 0)
  • READ COMMITTED(커밋된 읽기) (레벨 1)
  • REPEATABLE READ(반복 가능한 읽기) (레벨 2)
  • SERIALIZABLE(직렬화 가능) (레벨 3)

먼저 위에 순서대로 격리 수준이 가장 낮고 맨 아래가 가장 격리 수준이 높다. 격리 수준이 높아질 수록 MySQL서버의 처리 성능이 많이 떨어질 것이라 생각할 수 있지만 사실상 그렇지는 않다. 맨 아래 직렬화 가능 기능만 아니라면 크게 성능의 개선이나 저하는 일어나지 않는다.

격리 수준이 왜 필요한가?

  • 트랜잭션 수준 읽기 일관성을 지키기 위해서다. 그러니까 동시성 제어 문제 해결을 위해서 필요한 것.

트랜잭션 수준 읽기 일관성.
트랜잭션이 시작된 시점으로부터 일관성 있게 데이터를 읽어 들이는 것을 말한다.
하나의 트랜잭션이 진행되는 동안 다른 트랜잭션에의해 변경사항이 발생하더라도 이를 무시하고 계속 일관성 있는 데이터를 보여준다. (물론 트랜잭션 자신이 발생한 변경사항은 읽을 수 있다)

READ UNCOMMITTED

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

특징

Dirty Read, Non-Repeatable Read, Phantom Read 현상이 발생한다.

문제점.

데이터 정합성에 문제가 있다. RDBMS 표준에서는 격리수준으로 인정하지 않는다.

READ COMMITTED

RDB에서 대부분 기본적으로 사용되고 있는 격리 수준으로 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드 에서 값을 가져온다.

특징

  • Dirty Read가 발생하지는 않는다. 하지만 Non-Repeatable Read, Phantom Read 현상은 여전히 발생한다.
  • 온라인 서비스에서 가장 많이 선택되는 격리 수준이다.

REPEATABLE READ

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준이다.

  • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 번호에서 변경한 것만 읽게 된다.
  • 변경되기 전 레코드는 Undo 공간에 백업하고 실제 레코드 값을 변경한다.

특징

Dirty Read와 같은 현상은 발생하지 않지만 Phantom Read 현상은 여전히 발생한다.

문제점

하나의 트랜잭션 실행시간이 길어질수록 Undo에 백업된 레코드가 많아져서 멀티 버전을 관리해야하는 단점이 있다.

SERIALIZABLE

선행 트랜잭션이 특정 테이블을 읽는 경우(SELECT) 공유 잠금(shared lock) 을 걸어, 다른 트랜잭션에서 해당 테이블의 데이터를 UPDATE, DELETE, INSERT 작업을 못하도록 막는다.

특징

가장 단순한 격리 수준이지만 가장 엄격한 격리 수준으로
Phantom Read가 발생하지 않는다.

문제점

동시 처리 능력이 다른 격리수준보다 떨어지고 성능저하가 발생하여 데이터베이스에서 거의 사용되지 않는다.

0개의 댓글