728x90
Isolation Level(격리 수준)은 데이터베이스에서 트랜잭션들이 서로 간섭하지 않도록 하는 방법을 정의하는 중요한 개념입니다. 트랜잭션이 동시에 수행될 때 발생할 수 있는 문제(예: 일관성 깨짐)를 방지하기 위해, 트랜잭션 간의 격리 수준을 설정해 데이터를 보호할 수 있습니다.
격리 수준은 트랜잭션 간에 얼마나 많은 영향을 허용할지를 결정하며, 각 격리 수준은 서로 다른 수준의 일관성과 성능 사이에서 균형을 맞추는 방식입니다.
트랜잭션 동시성 문제
Isolation Level은 다음과 같은 동시성 문제를 해결하기 위해 존재합니다:
- Dirty Read: 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 경우.
- Non-repeatable Read: 한 트랜잭션 내에서 같은 데이터를 두 번 읽었을 때, 그 사이에 다른 트랜잭션에 의해 데이터가 변경되어 다른 값을 읽는 경우.
- Phantom Read: 한 트랜잭션 내에서 조건에 맞는 데이터의 집합을 조회했을 때, 그 사이에 다른 트랜잭션에 의해 새로운 데이터가 추가되거나 삭제되어 조회 결과가 달라지는 경우.
Isolation Level 종류
표준 SQL은 4가지 격리 수준을 정의합니다. 격리 수준이 낮을수록 성능은 좋아지지만, 동시성 문제가 발생할 수 있는 위험이 커집니다.
1. Read Uncommitted (가장 낮은 격리 수준)
- 설명: 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있습니다. 이 경우 Dirty Read가 발생할 수 있습니다.
- 문제 해결: 아무 문제도 해결하지 않으며, 가장 낮은 일관성을 보장합니다.
- 예시: 트랜잭션 A가 데이터를 수정했지만 아직 커밋되지 않은 상태에서, 트랜잭션 B가 수정된 데이터를 읽을 수 있습니다. 나중에 트랜잭션 A가 롤백되면, 트랜잭션 B는 잘못된 데이터를 처리하게 됩니다.
- 발생 가능 문제:
- Dirty Read
- Non-repeatable Read
- Phantom Read
2. Read Committed (기본적인 격리 수준)
- 설명: 트랜잭션이 커밋된 데이터만 읽을 수 있습니다. Dirty Read는 방지되지만, Non-repeatable Read는 발생할 수 있습니다.
- 문제 해결: Dirty Read 방지.
- 예시: 트랜잭션 A가 데이터를 커밋하기 전까지, 트랜잭션 B는 그 데이터를 읽을 수 없습니다. 그러나 트랜잭션 B가 데이터를 두 번 조회했을 때, 그 사이에 트랜잭션 A가 데이터를 수정하고 커밋했다면, 서로 다른 값을 읽을 수 있습니다.
- 발생 가능 문제:
- Non-repeatable Read
- Phantom Read
3. Repeatable Read (일관성 보장 수준 강화)
- 설명: 트랜잭션 내에서 읽은 데이터는 트랜잭션이 끝날 때까지 변하지 않도록 보장합니다. Non-repeatable Read는 방지되지만, Phantom Read는 여전히 발생할 수 있습니다.
- 문제 해결: Dirty Read, Non-repeatable Read 방지.
- 예시: 트랜잭션 A가 특정 데이터를 읽고, 그 데이터를 다시 조회할 때까지 다른 트랜잭션 B가 그 데이터를 수정할 수 없습니다. 그러나 트랜잭션 B가 새로운 데이터를 삽입하면, 트랜잭션 A는 조건에 따라 조회 결과가 달라질 수 있습니다.
- 발생 가능 문제:
- Phantom Read
4. Serializable (가장 높은 격리 수준)
- 설명: 트랜잭션이 마치 순차적으로 처리되는 것처럼 격리됩니다. Dirty Read, Non-repeatable Read, Phantom Read가 모두 방지됩니다. 가장 높은 일관성을 보장하지만, 성능이 크게 저하될 수 있습니다.
- 문제 해결: Dirty Read, Non-repeatable Read, Phantom Read 모두 방지.
- 예시: 트랜잭션 A가 실행되는 동안, 트랜잭션 B는 트랜잭션 A와 충돌할 수 있는 어떤 데이터도 수정하거나 삽입할 수 없습니다. 완벽한 일관성을 보장하지만, 트랜잭션 간의 동시성이 크게 제한됩니다.
728x90
요약
각 Isolation Level의 문제 해결 능력과 성능 간의 트레이드오프는 다음과 같습니다:
Isolation Level | Dirty Read | Non-repeatable Read | Phantom Read | 성능 |
Read Uncommitted | 발생 가능 | 발생 가능 | 발생 가능 | 매우 높음 |
Read Committed | 방지됨 | 발생 가능 | 발생 가능 | 높음 |
Repeatable Read | 방지됨 | 방지됨 | 발생 가능 | 중간 |
Serializable | 방지됨 | 방지됨 | 방지됨 | 낮음 |
Isolation Level은 데이터베이스에서 성능과 일관성 간의 균형을 맞추는 중요한 설정입니다. 낮은 수준의 격리 설정은 더 나은 성능을 제공할 수 있지만 일관성 문제가 발생할 수 있습니다. 반대로, 높은 격리 수준은 완벽한 일관성을 제공하지만 성능 저하를 초래할 수 있습니다.
따라서, 애플리케이션의 요구 사항에 따라 적절한 격리 수준을 선택이 필요합니다.
728x90
'Data Science > DB+SQL' 카테고리의 다른 글
[DuckDB] DuckDB Installation (0) | 2024.09.24 |
---|---|
[DuckDB] what is DuckDB (0) | 2024.09.24 |
[DBMS] Data Consistency 와 Data Integrity 차이 (0) | 2024.09.21 |
[mysql] Temporary Tablespace 관리 (0) | 2024.04.26 |
[mysql] SQL split string to multiple rows (0) | 2023.09.20 |
최근댓글