Skip to content

데이터베이스의 격리수준에 대해서 설명해주세요

notion / DB 격리수준


DB의 Isolation Level(격리 수준) 은 여러 트랜잭션이 동시에 실행될 때, 트랜잭션 간의 독립성을 어느 정도 보장할 것인지를 결정하는 설정입니다. 이를 통해 일관성동시성 간의 균형을 유지할 수 있습니다.

Isolation Level은 각기 다른 수준에서 트랜잭션의 고립성을 제공하며, 데이터베이스의 성능에 영향을 미칩니다. 트랜잭션 격리 수준을 이해하려면 트랜잭션 간의 충돌로 인한 문제와 그것을 완화하기 위해 정의된 4가지 주요 격리 수준을 알아야 합니다.

트랜잭션 충돌로 인해 발생할 수 있는 문제들#

  1. Dirty Read (더티 리드):
  2. 하나의 트랜잭션이 다른 트랜잭션에서 커밋되지 않은 변경을 읽는 경우.
  3. 예: 트랜잭션 A가 데이터를 수정하고 아직 커밋하지 않았을 때, 트랜잭션 B가 그 데이터를 읽음.

  4. Non-repeatable Read (반복 불가능한 읽기):

  5. 동일한 트랜잭션 내에서 동일한 데이터를 두 번 읽을 때, 다른 트랜잭션에 의해 데이터가 수정된 것을 감지하는 경우.
  6. 예: 트랜잭션 A가 처음 데이터를 읽은 후 트랜잭션 B가 해당 데이터를 수정하고 커밋하여, 트랜잭션 A가 다시 읽을 때 값이 바뀜.

  7. Phantom Read (팬텀 리드):

  8. 트랜잭션이 동일한 쿼리를 두 번 수행했을 때, 다른 트랜잭션이 새로운 행을 삽입하거나 삭제하여 결과 집합이 달라지는 경우.
  9. 예: 트랜잭션 A가 조건에 맞는 행을 조회했는데, 그 사이 트랜잭션 B가 조건에 맞는 새로운 행을 삽입하거나 삭제하여 A가 다시 조회할 때 결과가 달라짐.

Isolation Level (격리 수준)#

각 Isolation Level은 위 문제들에 대해 다르게 처리합니다. 다음은 SQL 표준에서 정의한 4가지 격리 수준입니다:


1. Read Uncommitted (읽기 미커밋)#

  • 설명: 트랜잭션이 다른 트랜잭션에서 커밋되지 않은 변경 사항을 읽을 수 있습니다.
  • 허용되는 문제: Dirty Read, Non-repeatable Read, Phantom Read 모두 발생할 수 있음.
  • 사용 사례: 성능이 매우 중요한 상황에서, 일관성보다는 동시성을 우선시하는 경우에 사용될 수 있지만, 데이터 무결성을 해칠 수 있습니다.
  • 장점: 높은 동시성, 최소한의 잠금 사용.
  • 단점: 데이터 일관성이 전혀 보장되지 않음.

2. Read Committed (읽기 커밋)#

  • 설명: 트랜잭션은 커밋된 데이터만 읽을 수 있습니다. 즉, 다른 트랜잭션에서 커밋되지 않은 변경 사항은 읽지 못합니다.
  • 허용되는 문제: Non-repeatable Read, Phantom Read가 발생할 수 있음.
  • 사용 사례: 대부분의 데이터베이스에서 기본으로 사용하는 격리 수준입니다. Dirty Read를 방지하지만, 여전히 Non-repeatable Read와 Phantom Read가 발생할 수 있습니다.
  • 장점: Dirty Read 방지, 성능과 일관성의 균형.
  • 단점: Non-repeatable Read와 Phantom Read 문제는 해결하지 못함.

3. Repeatable Read (반복 가능한 읽기)#

  • 설명: 트랜잭션이 동일한 데이터를 여러 번 읽을 때 항상 동일한 결과를 보장합니다. 즉, 다른 트랜잭션이 해당 데이터에 대해 커밋을 해도, 트랜잭션이 종료될 때까지 읽은 데이터는 변경되지 않습니다.
  • 허용되는 문제: Phantom Read가 발생할 수 있음.
  • 사용 사례: 트랜잭션 내에서 읽은 데이터를 반복적으로 조회하고, 데이터 변경에 민감한 작업에서 사용됩니다. InnoDB 엔진의 MySQL이 기본적으로 사용하는 격리 수준입니다.
  • 장점: Dirty Read와 Non-repeatable Read를 방지.
  • 단점: 여전히 Phantom Read 문제를 해결하지 못함.

4. Serializable (직렬화 가능)#

  • 설명: 가장 엄격한 격리 수준으로, 트랜잭션이 완전히 직렬화되어 실행되는 것처럼 동작합니다. 트랜잭션 간에 충돌이 발생하지 않도록 잠금이 강화되며, 트랜잭션들이 완전히 독립적으로 실행됩니다.
  • 허용되는 문제: Dirty Read, Non-repeatable Read, Phantom Read 모두 방지됨.
  • 사용 사례: 데이터 무결성이 가장 중요한 환경에서 사용되며, 트랜잭션 간에 충돌을 완전히 제거해야 하는 경우 적합합니다.
  • 장점: 모든 트랜잭션 충돌 문제를 방지.
  • 단점: 성능 저하가 심하며, 동시성 처리가 제한됨.

각 Isolation Level의 정리#

격리 수준 Dirty Read Non-repeatable Read Phantom Read
Read Uncommitted 허용 허용 허용
Read Committed 방지 허용 허용
Repeatable Read 방지 방지 허용
Serializable 방지 방지 방지

격리 수준 선택 시 고려 사항#

  1. 성능 vs 일관성: 격리 수준이 높아질수록 트랜잭션 간의 동시성이 줄어들고 성능이 저하될 수 있습니다. 따라서 트랜잭션의 일관성 요구사항에 맞추어 적절한 격리 수준을 선택해야 합니다.

  2. 비즈니스 로직 요구사항: 중요한 데이터를 처리하거나 재고 관리, 금융 트랜잭션과 같이 데이터 무결성이 필수적인 작업에서는 높은 격리 수준이 요구되지만, 로그 데이터 수집이나 분석 같은 경우에는 낮은 격리 수준도 적절할 수 있습니다.

실제 데이터베이스의 기본 Isolation Level#

  • MySQL (InnoDB): 기본적으로 Repeatable Read를 사용합니다.
  • PostgreSQL: 기본적으로 Read Committed를 사용합니다.
  • SQL Server: 기본적으로 Read Committed를 사용합니다.

격리 수준은 시스템의 성능과 트랜잭션 간 일관성을 조절하는 중요한 도구입니다. 각 격리 수준은 데이터 무결성과 성능 사이에서 적절한 균형을 맞추도록 설계되어 있기 때문에, 사용자의 요구에 따라 적절한 격리 수준을 선택하는 것이 중요합니다.