이상 현상
고립성 보장되지 않은 상태에서 트랜잭션 동시 실행되면 발생하는 문제점
Dirty read
commit 되지 않은 변화 읽음
모든 레벨에서 허용하면 안됨
ex) (유효하지 않은 데이터(commit 되기 전 다른 트랜잭션)이 읽어서 결과 이상)
Non-repeatable read
같은 데이터 값 달라짐
ex) 읽기 작업 반복할 경우 결과 반복되지 않는 현상
phantom read
없던 데이터 생김
ex) 읽기 작업 반복할 경우 이전에 없던 데이터 생겨남
Dirty read , Non-repeatable read , phantom read
=> 이런 이상한 현상 모두 발생 하지않게 만들 수 있음
하지만 그러면 제약사항 많아지고 동시 처리 가능한 트랜잭션 수 줄어들어
결국 db 전체 처리량 (throughput) 하락
trade off !
사용자가 필요 따라 적절하게 선택!! -> isolation level
isolation level 격리 수준
서로 얼마나 고립되어 있는지 정도
설계자는 isolation level 통해
전체 처리량 thruouput 과 데이터 일관성 사이에서 어느정도 거래(tradeoff) 할 수 있음
(위에서 아래로 갈수록 허용하지 않는 현상 늘어남)
트랜잭션 격리 수준 명령어
Lv0 ) READ UNCOMMITTED (커밋되지 않은 읽기) (팬텀 리드, 반복 가능하지 않은 조회, 더티 리드)
다른 트랜잭션에서 커밋되지 않은 내용도 조회할 수 있다.
- 무결성을 위해 사용하지 않는 것이 좋다.
Lv1 ) READ COMMITTED (커밋된 읽기) (팬텀 리드, 반복 가능하지 않은 조회)
- 다른 트랜잭션에서 커밋된 데이터만 조회할 수 있다.
- 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다.
- 가장 많이 사용되는 격리 수준, 많은 데이터베이스의 default 값
Lv2 ) REPEATABLE READ (반복 가능한 읽기) (팬텀 리드)
트랜잭션에 진입하기 이전에 커밋된 내용만 조회할 수 있다.
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록
막아주지만 새로운 행을 추가하는 것은 막지 않는다.
Lv4 ) SERIALIZABLE (직렬화 가능)
- 트랜잭션을 순차적으로 진행, 매우 엄격하다.
- 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.
- 교착 상태가 일어날 확률이 높고 성능이 매우 떨어진다.
+
일부 isolation level에서 발생하는 읽기나 쓰기 연산에 대한 충돌 발생
==> 그러한 충돌 방지하고 동시에 더 높은 수준의 동시성을 제공하기 위해 도입
스냅샷 격리
각 트랜잭션이 시작될 때 데이터베이스의 스냅샷(데이터베이스 상태의 사본)을 가져와서
해당 스냅샷을 트랜잭션의 수명 동안 일관된 상태로 유지
이는 다른 트랜잭션이 동일한 데이터를 수정하거나 삭제하는 동안에도 트랜잭션이 읽는 데이터가 변경되지 않음을 보장
- **읽기 일관성(Read Consistency)**: 트랜잭션이 시작될 때의 데이터 상태를 스냅샷으로 만들어 사용하여, 동시에 여러 트랜잭션이 일관된 데이터를 볼 수 있습니다.
- **쓰기 트릭 방지(No Write Skew)**: 다른 트랜잭션이 변경한 데이터를 읽고, 이를 기반으로 조건을 만족하는 데이터를 변경하는 쓰기 트릭을 방지하여 데이터 일관성을 유지합니다.
- **낙관적 동시성 제어(Optimistic Concurrency Control)**: 트랜잭션이 커밋하기 전까지 다른 트랜잭션에 의해 변경된 데이터가 없다고 가정하여, 충돌 없이 실행될 수 있습니다.
쓰기 연산에 대한 제약이 적기 때문에 동시성이 높을 수 있으나,
구현을 위해서는 데이터베이스 시스템이 지원해야 하며, 이를 위해 추가적인 리소스가 필요할 수 있음
스냅샷 격리는 이러한 제약을 극복하여 isolation level의 한계를 극복하고 더욱 견고한 데이터 일관성을 제공
+데드락
데드락(DeadLock) 발생 조건
4가지 모두 성립해야 데드락 발생
(하나라도 성립하지 않으면 데드락 문제 해결 가능)
- #상호 배제(Mutual exclusion)자원은 한번에 한 프로세스만 사용할 수 있음
- #점유 대기(Hold and wait)최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 함
- #비선점(No preemption)다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음
- #순환 대기(Circular wait)프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 함
데드락(DeadLock) 발생 조건
4가지 모두 성립해야 데드락 발생
(하나라도 성립하지 않으면 데드락 문제 해결 가능)
- #상호 배제(Mutual exclusion)자원은 한번에 한 프로세스만 사용할 수 있음
- #점유 대기(Hold and wait)최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 함
- #비선점(No preemption)다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음
- #순환 대기(Circular wait)프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 함
https://gyoogle.dev/blog/computer-science/operating-system/DeadLock.html
+출처
'CS' 카테고리의 다른 글
CSS)DB_05_Schema (0) | 2024.03.25 |
---|---|
S)DB_04_RDBMS vs Nosql (3) | 2024.03.16 |
S)DB_03_트랜잭션2 (1) | 2024.03.14 |
S)DB_03_트랜잭션 (0) | 2024.03.12 |
S) 01_Feedback (2) | 2024.03.11 |