[DataBase] 트랜잭션 격리수준(isolation level)이란?
[DataBase] 트랜잭션 격리수준(isolation level)이란? — #데이터베이스트랜잭션격리수준 #트랜잭션격리수준 #Isolationlevel #트랜잭션격리수준 #개발자의도구들 ...
#데이터베이스트랜잭션격리수준 #트랜잭션격리수준 #Isolationlevel #트랜잭션격리수준 #개발자의도구들
🚨📝 📖 📒
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 Spring 프로젝트를 진행 중입니다. 전체적인 목차를 보시려면 여기를 눌러주세요.
들어가기에 앞서
이전글을 통해 transaction 속성 ACID를 다뤘었습니다. 오늘 하고자하는 이야기는 isolation level로 ACID에서의 I = isolation의 격리수준입니다.
| 💡 쓰레드와 비교해서 보자면 Isolation은 Lock과 비슷해 보입니다만, isolation은 레벨에 따라 동작이 나눠지기 때문에 다르다고 할 수 있씁니다. |
|---|
solation에는 총 4가지 level이 존재하는데요. 쓰레드의 Lock과 동일하게 동작하는 Level도 있고, 더 완화된 Level도 있습니다.
이 level 별로 어떤점에서 차이가 있는지를 중점적으로 보시면 좋을 것 같아요.
목차:
- Isolation의 등장배경
- Isolation levels
Isolation의 등장배경
우선 Isolation은 어떤 트랜잭션도 다른 트랜잭션이 수행될 때 개입되어서는 안된다는 원칙입니다. 이는몇가지 잠재적인 문제점을 해결하기 위해 나온 원칙인데요.
Dirty Read:
트랜잭션이 커밋되지 않는 다른 트랜잭션의 데이터를 읽을 때 발생합니다. 이는 읽은 데이터가 롤백될 가능성이 있기 때문에 신뢰할 수 없는 데이터입니다.
Non-Repeatable Read
트랜잭션 중에 동일한 데이터를 두번 읽을 때, 그 사이에 다른 트랜잭션이 값을 수정하여 동일한 데이터이지만 서로 다른 데이터 값이 나오는 상황입니다.
Phantom Read
트랜잭션이 수행하는 동안 다른 트랜잭션이 새로운 데이터를 삽입하여 처음 읽을때는 없던 새로운 데이터가 나타나는 상황입니다.
이렇게 크게 세가지의 잠재적 문제점을 해결하기 위해 Isolation원칙이 등장하게 되는데요. 모두 하나의 트랜잭션이 온전히 실행중 다른 트랜잭션이 개입하여 발생하는 문제가 되겠습니다.
| 💡 그림의 세로축을 시간 선으로 보시면 이해하기가 편합니다. 💡 트랜잭션은 여러 동작의 묶음입니다. 고로 하나의 트랜잭션에서 여러번의 Read를 하는 경우가 가능합니다. |
|---|
Isolation levels
위의 문제들을 해결하기위해 데이터베이스는 Isolation을 총 4개의 레벨로 나누어 관리하고 있습니다.
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
각 단계는 밑으로 갈수록 더 강한(엄격한) 레벨입니다. 여기서 엄격하다는 것은, 어느 정도로 isolation을 유지할 것인지에 대한 척도라고 생각하시면 편합니다.
\* 즉 level 1은 level 2보다 isolation의 엄격도가 약하다는 개념입니다.
\* 엄격도와 성능은 trade off 입니다.
Read Uncommitted
가장 낮은 isolation 레벨입니다. 이말은 즉 가장 isolation 엄격도가 낮다는 것입니다. 이는 커밋되지 않은 데이터를 모두 볼 수 있는데, 위의 DirtyRead를 생각하시면 이해하는데 도움이 됩니다.
엄격도가 제일 낮기 때문에 성능면에서는 뒤어날 수 있습니다. 하지만 DirtyRead때문에 비정상적인 데이터 처리가 이루어질 수 있습니다.
\* 다른 트랜잭션 변경사항을 변경이 일어나자마자 바로 볼 수 있습니다.
Read Uncommitted
다른 트랜잭션에서 커밋된 트랜잭션만을 읽을 수 있습니다. Dirty-read 방지는 가능하지만, Non-repeatable Read가 여전히 발생할 수 있습니다.
Repeatable Read
트랜잭션 시작지점에 데이터 스냅샷을 찍어, 읽기 작업을 수행합니다. 트랜잭션이 여러번 데이터를 읽을때의 동일 결과를 보장합니다. 하지만 Phantom Read가 발생할 수 잇습니다.
Serializable
모든 트랜잭션을 완전히 격리시킵니다. Thread의 LOCK과 동일하게 작동합니다. 각 트랜잭션은 서로 완전히 영향을 끼치지 못하게 되어, 가장 강력하게 일관성과 무결성을 보장합니다.
Transaction이 묶이기 때문에 성능면에서는 뛰어나지 못합니다. 특히 동시성을 요구하는 시스템 내에서는 매우 비효율적일 수 있습니다.


