저번 DeadLock 과 Redis 대기열(1) 포스팅에서 DeadLock 해결법에 여러가지가 있다고 한 것중에 트랜잭션의 격리 수준을 조절하는 방법이 있다고 했는데, 이 때 트래잭션의 격리 수준에 대해서 알아보도록 하겠습니다.
트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다. 또한, 데이터베이스 관리 시스템에서 여러 개의 동시 실행되는 트랜잭션들 간에 어떻게 데이터의 일관성과 격리를 유지할지를 정의하는 개념입니다.
격리 수준은 아래와 같이 4가지로 나뉩니다.
1.Read Uncommitted(레벨 0)
- 가장 낮은 격리 수준이며, 트랜잭션에서 변경된 내용이 커밋되지 않더라도 다른 트랜잭션에서 해당 내용을 읽을 수 있습니다.
- 데이터 일관성 및 격리가 보장되지 않기 때문에 거의 사용되지 않습니다.
- Dirty-Read가 발생합니다.
- 더티 리드는 특정 트랜잭션에 이해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제를 말합니다.
- 이 문제는 트랜잭션 A가 데이터를 변경하고 커밋하지 않은 시점에 트랜잭션 B가 변경된 데이터를 읽어온 상황에서, 트랜잭션 A가 변경 내용을 커밋하지 않고 롤백한 상황에서 치명적이다. 트랜잭션 B는 무효가 된 값을 읽고 처리하므로 문제가 발생한다.
2.Read Committed(레벨 1)
- 이 격리 수준에서는 트랜잭션이 커밋된 데이터만 다른 트랜잭션에서 읽을 수 있습니다. 다만, 동일한 트랜잭션 내에서도 일관성 없는 데이터를 읽을 수 있습니다.
- 데이터의 무결성과 일부 격리가 보장됩니다.
- 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨.
- Non-Repeatable 문제 발생 (같은 트랜잭션 내에서 같은 데이터를 여러번 조회했을 때 읽어온 데이터가 다른 경우를 의미한다.)
3. Repeatable Read(레벨 2)
- 한 트랜잭션 내에서 동일한 쿼리를 여러 번 실행해도 결과가 항상 같음이 보장됩니다. 다른 트랜잭션에서는 해당 데이터를 수정할 수 없습니다.
- 트랜잭션이 완료될 때 까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.
- 이를 위해 읽는 동안 획득한 잠금(lock)을 유지하여 다른 트랜잭션의 수정을 방지합니다.
- SERIALIZABLE과 다르게 행이 추가되는 것을 막지 않는다. 이로 인해 팬텀 리드 현상이 발생할 수 있다.
- 팬텀 리드는 Non-Repeatable Read의 한 종류로 조회해온 결과의 행이 새로 생기거나 없어지는 현상이다.
4.Serializable(레벨 3)
- 가장 높은 격리 수준으로, 모든 트랜잭션 간에 충돌이 발생하지 않도록 보장합니다. 이를 위해 트랜잭션 간에 잠금을 걸어 동시성을 완전히 제어합니다.
- 데이터 일관성과 격리가 보장되지만, 동시성이 저하될 수 있습니다.
- 다른사용자는 트랜잭션 영역에 해당되는 데이터에 대항 수정 및 입력 불가능합니다.
💡 격리 수준 선택 시 고려사항
- Isolation level에 대한 선택은 동시성과 데이터 무결성에 연관되어 있다.
- 동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 됩니다.
- level을 높게 지정할수록 비용이 많이 발생합니다.
결론적으로 정리를 하면, 트랜잭션 격리수준이 높을 수록 데이터 무결성 및 정합성이 높아지나, 동시성(성능)은 낮아지게 된다.
반대로 격리수준이 낮을 수록 동시성(성능)은 높아지나, 데이터 정합성이 깨지는 여러 부정합문제가 발생할 수 있다.
그러므로 각 서비스에 특성에 맞게 적절한 격리수준을 선택하여 사용하여야 합니다.
'운영체제' 카테고리의 다른 글
DeadLock과 Redis 대기열 사용하기 - (2) (1) | 2023.08.31 |
---|---|
DeadLock과 Redis 대기열 사용하기 - (1) (0) | 2023.08.30 |
[Pintos-Kaist] Project3 - Swap In/Out (0) | 2023.06.26 |
[Pintos-Kaist] Project3 - Stack Growth, Memory Mapped Files (0) | 2023.06.24 |
[Pintos-Kaist] Project3 - Anonymous Page (0) | 2023.06.19 |