이번 프로젝트에 transaction을 적용하며 TypeORM이 지원하는 transaction의 격리 수준에 대해 정리한다.
트랜잭션 격리 수준(Isolation Level)은 데이터베이스에서 동시에 실행되는 트랜잭션들 간에 어떻게 상호작용하고 데이터 일관성을 유지할지를 정의하는 개념이다. TypeORM은 다양한 트랜잭션 격리 수준을 지원한다.
1. Read Uncommitted (Level 0):
- 가장 낮은 격리 수준이며, 트랜잭션의 변경 내용이 커밋되지 않았더라도 다른 트랜잭션에서 해당 변경 내용을 읽을 수 있다.
- Dirty Read, Non-repeatable Read, Phantom Read 등과 같은 일관성 문제가 발생할 수 있다.
2. Read Committed (Level 1):
- 기본적으로 대부분의 데이터베이스에서 사용되는 격리 수준이다.
- 트랜잭션이 커밋된 변경 내용만을 다른 트랜잭션에서 읽을 수 있다.
- Dirty Read는 방지하지만 Non-repeatable Read와 Phantom Read는 여전히 발생할 수 있다.
3. Repeatable Read (Level 2):
- 한 트랜잭션 내에서 같은 쿼리를 실행해도 항상 동일한 결과를 보장한다.
- 트랜잭션이 실행되는 동안 다른 트랜잭션이 해당 데이터를 수정하거나 추가할 수는 있지만,
수정된 데이터는 해당 트랜 잭션이 종료될 때까지 읽을 수 없다.
- Phantom Read 문제는 여전히 발생할 수 있다.
4. Serializable (Level 3):
- 가장 높은 격리 수준이며, 동시성 제어를 위해 가장 강력한 격리 수준이다.
- 동시에 실행되는 트랜잭션 간에 상호 차단(Deadlock)을 방지하기 위해 일련의 잠금(Locks)을 사용한다.
- 다른 트랜잭션이 이미 사용 중인 데이터에 대한 읽기 및 쓰기 작업을 차단한다.
- 일관성 문제는 발생하지 않지만 동시성 성능이 저하될 수 있다.
트랜잭션 격리 수준은 데이터베이스 제품에 따라 지원 수준과 동작 방식이 다를 수 있으므로,
실제 사용 시에는 해당 데이터베이스의 특성과 요구사항을 고려하여 적절한 격리 수준을 선택해야 한다.
처음엔 격리레벨을 'Serializable'로 설정했었는데
생각해보니 여러명의 유저가 같은 영화의 상세페이지에 접속할 때
데이터(좋아요 수)를 읽을 수는 있어야하기에 'Read Committed'로 바꿔서 설정해주었다.
'Development > TIL' 카테고리의 다른 글
TypeORM enum 타입 사용하기 (0) | 2023.06.02 |
---|---|
git stash(생성, 삭제, 복구) (0) | 2023.06.01 |
Typeorm Transaction (0) | 2023.05.29 |
NestJS_Configuration (0) | 2023.05.26 |
Nest.js (feat.Pipe) (0) | 2023.05.24 |