MVCC를 이해하기 위한 여러가지 정보
격리성레벨
1. read uncommit
가장낮은 격리수준.
한 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다. => Dirty Read 문제가 발생할수있음 (드릅게 읽힌다)
Dirty Read: 다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다.
즉, 다른 트랜잭션이 완료되지 않았는데 변경된 데이터를 읽을 수 있음.
2. read commit
한 트랜젹션은 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다.
=> Dirty Read 문제는 해결 되지만 Non-repeatable Read 문제가 발생할 수 있음
=> 외부에서 개입할수있기때문에(한번에 두번한다면?!) 데이터가 일치하지않을 가능성. 찝찝함.
Non-repeatable Read: 같은 쿼리를 두 번 실행할때 결과가 다를 수 있다.
다른 트랜잭션이 커밋되면서 읽는 도중에 데이터가 변경될 수 있기 때문
3. repeatable read
한 트랜잭션은 동일한 쿼리를 여러번 실행해도 동일한 결과를 보장한다. 한 트랜잭션이 읽는 동안 다른 트랜잭션이 해당 데이터를 수정할 수 없음! sql에서의 기본 격리라고 한다.
=> 그러나 여전히 Phantom read 문제가 발생할 가능성
Pantom read: 다른 트랜잭션이 커밋되면서 특정 범위내에 새로운 행이나 기존 행이 추가 또는 삭제될 때 발생
유령 데이터를 읽게 되는것.
4. Seriablizable
제일 높은 격리. 한 트랜잭션이 다른 트랜잭션과 직렬화되어 실행된다.
근데 제일 높은 수준의 격리가 있는데 왜 3번 격리방법을 쓰는가?
=> 격리성은 높으나 성능이 떨어진다!
=> 모든 레코드에 락을 걸어버리게 됨;;!!!
그래서 MVCC가 무엇이냐!
MVCC(다중 버전 동시성 제어)
데이터베이스 시스템에서 동시성을 제어하는 기술 중 하나.
이 기술은 한 트랜잭션이 데이터를 읽거나 쓸 때 다른 트랜잭션의 동작에 영향을 받지 않도록 하면서도 일관된 데이터베이스 상태를 유지한다.
각 트랜잭션마다 버전을 유지하여 데이터를 관리한다.
각 트랜잭션이 시작될 때 데이터베이스에서 읽는 시점에 해당하는 데이터의 버전을 기록하고, 해당 트랜잭션이 커밋될 때까지는 해당 버전의 데이터를 유지한다. 이를 통해 한 트랜잭션이 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 변경하더라도 트랜잭션 간 충돌을 방지한다.
MVCC를 사용하면 동일한 데이터에 대해 여러 트랜잭션이 동시에 읽기와 쓰기를 수행할 수 있으며, 격리 수준이 낮은 트랜잭션에 대한 성능 저하를 최소화할 수 있다. 또한 MVCC는 롤백된 트랜잭션의 데이터를 관리하는 데에도 유용하게 사용된다. 따라서 MVCC는 데이터베이스 시스템에서 동시성을 향상시키고 일관성을 유지하는 데 중요한 역할을 한다.
튜터님이 간단 설명 버전
기본 트랜잭션의 원리는 undo log 곳에 원본 데이터를 넣고, 커밋과 롤백에 따라 데이터를 조작하는것
MVCC를 사용한다는것은 트랜잭션마다 고유한 시간스탬프 또는 아이디를 부여해 버전을 관리한다.
각 트랜잭션마다 아이디를 부여하는데, 그럼 여러 트랜잭션이 쌓인다. 그 중에서 격리성레벨이 낮은것은 읽지 않는다.
고로 반복되는 읽기가 발생하지 않는다!
'TIL' 카테고리의 다른 글
TIL #32) Linked List 자료구조 (0) | 2024.03.20 |
---|---|
TIL #31) LLM (0) | 2024.03.18 |
TIL #29) 0312 오늘 한일 (0) | 2024.03.12 |
TIL #28) 싱글톤 패턴 (0) | 2024.03.12 |
TIL #27) Error: getaddrinfo EAI_FAIL 오류 (0) | 2024.03.07 |