격리 수준

parkrootseok·2025년 8월 10일
0

데이터베이스

목록 보기
10/10
post-thumbnail

격리 수준이란?

격리 수준이란 동시에 실행되는 트랜잭션이 서로에게 얼마나 영향을 미치지 않도록 할지를 결정하는 정도를 말합니다. 즉, 트랜잭션 간의 동시성과 정합성의 균형을 조절하는 설정입니다.

왜, 필요할까요?

데이터베이스는 기본적으로 여러 사용자가 동시에 접근할 수 있습니다. 만약, 격리 수준이 낮으면 성능은 좋지만 예상치 못한 결과가 나올 수 있습니다. 또한, 격리 수준이 너무 높아도 Lock 경합으로 인해 성능이 저하될 수 있습니다. 즉, 트랜잭션을 사용하는 목적에 따라 정합성과 성능의 균형을 맞추기 위해 필요합니다.

종류

격리 수준에는 4가지 종류가 존재합니다.

READ UNCOMMITTED

Read Uncommitted는 커밋되지 않은 데이터까지 읽을 수 있는 수준으로 정합성 낮으나 성능은 제일 높습니다.

READ COMMITED

Read Committed는 커밋된 데이터까지 읽을 수 있는 수준으로 대부분 DB에서 기본 격리 수준으로 사용합니다. 특정 레코드를 읽는 동안 다른 트랜잭션이 해당 레코드를 수정하지 못하도록 공유락을 설정하여 정합성을 유지합니다.

REPEATABLE READ

Repeatable Read는 트랜잭션 내에서 조회한 레코드에 대한여 동일한 결과값이 나오는 것을 보장하는 수준으로 MySQL의 기본 격리 수준입니다. 처음으로 레코드를 조회할 때 스냅샷을 생성하여 정합성을 유지합니다.

왜, MySQL은 REPEATABLE READ를 기본으로 선택했을까요?

MySQL은 데이터의 무결성을 우선시하도록 설계된 DB이며, 이유는 다음과 같습니다.

  • MySQL의 InnoDB는 MVCC를 사용
    • MVCC는 스냅샷을 이용해 트랜잭션 시작 지점의 데이터를 계속 읽을 수 있음
  • Gap Lock과 Next-Key Lock을 사용해 Phantom Read 방지 가능
    • InnoDB에서는 Repeatable Read 수준에서 거의 Serializable 수준의 정합성 확보

SERIALIZABLE

Serializable은 모든 트랜잭션이 순차적으로 처리하도록 보장하는 수준으로 가장 정합성은 높으나 성능은 제일 낮습니다. 범위락을 걸어서 다른 트랜잭션이 범위 내에 읽기/쓰기를 불가하도록 하여 정합성을 유지합니다.

이상 현상

격리 수준이 낮을수록 데이터 정합성 또한 낮습니다. 이로 인해, 3가지 이상 현상이 발생할 수 있습니다.

Dirty Read

Dirty Read커밋되지 않은 데이터를 읽을 수 있는 현상으로 Read Uncommitted 수준에서 발생하는 이상 현상입니다.

Non-Repeatble Read

Non-Repeatble Read동일한 트랜잭션 내에서 같은 행을 두 번 읽었을 때 결과가 다를 수 있는 현상으로 Read Committed 수준에서 발생하는 이상 현상입니다.

Phantom Read

Phantom Read특정 범위에 대한 조회 쿼리를 수행한 결과가 가지는 행의 갯수가 다를 수 있는 현상으로 Repeatable Read에서 발생하는 이상 현상입니다.

profile
동료들의 시간과 노력을 더욱 빛내줄 수 있는 개발자가 되고자 노력합니다.

0개의 댓글