728x90
트랜잭션의 Isolation이 제대로 유지되려면 복수의 트랜잭션을 동시에 실행할 경우, 이상 현상이 일어나지 않도록 한다.
이것을 보장하기 위한 중요한 속성이 Serializability와 Recoverable이다.
즉, 이 두 가지 속성이 보장될 수 있도록 해야 한다.
하지만 이때 동시에 처리할 수 있는 트랜잭션의 수가 줄어들어서 DBMS의 성능이 하락한다는 단점이 있다.
이를 해결하기 위해 DBMS의 concurrency control은 여러 종류의 Isolation level을 제공해서 개발자가 데이터 정합성과 성능 사이에서 어느 정도 트레이드 할 수 있도록 한다.
Serializabiliy
👉 여러 트랜잭션을 병렬로 동시에 처리하면서도 순차적으로 수행한 것과 같은 결과를 내는 것
Recoverable
👉 여러 트랜잭션 중 하나가 실패 시 회복이 가능한 것
값을 write하는 트랜잭션은 반드시 값을 read하는 트랜잭션보다 먼저 commit 되어야 함
1. 이상 현상
Isolation이 보장되지 않아 트랜잭션이
동시에 실행되면 발생하는 문제점은?
Dirty Write 더티 라이트
- 정의: 같은 데이터에 대해 동시에 두 개의 트랜잭션이 값을 바꾸고자 할 때 발생되는 현상
Dirty Read 더티 리드
- 정의: 아직 종료(commit)되지 않은 트랜잭션의 내용을 읽는 것. 비정상적 상태의 데이터를 읽게 되는 현상
- 어떠한 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상
Non-repeatable Read (반복 가능하지 않은 조회, Fuzzy Read)
- 정의: 어떤 트랜잭션에서 동일한 데이터 값을 매번 읽을 때마다 달라지는 현상
- 동일한 select 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 Repeatable Read 정합성에 어긋나는 현상
- 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 현상
Phantom Read 팬텀 리드
- 정의: 한 트랜잭션 내에서 동일한 쿼리를 두 번 보냈을 때, 첫 번째 쿼리에서 존재하지 않던 유령 레코드가 두 번째 쿼리에서 나타나는 현상 (없던 데이터가 생기는 현상)
❗ 이상 현상이 발생하면 안 되지만, 이런 이상 현상을 모두 발생하지 않게 한다면 제약사항이 많아져 동시 처리 가능한 트랜잭션 수가 줄어들게 된다.
👉 DB의 전체 처리량이 하락하게 됨
👉 일부 이상 현상은 허용하는 몇 가지 level을 만들어 개발자가 필요에 따라 적절하게 선택할 수 있도록 4단계로 그 수준을 분리함
2. 격리 수준Isolation level
- 정의: 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
- 위로 갈수록 동시성이 강해지지만 격리성은 약해지고, 아래로 갈수록 동시성은 약해지고 격리성이 강해짐
Read Uncommitted 커밋되지 않은 읽기
- 허용: 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드
- 정의: 다른 트랜잭션에서 커밋되지 않은 내용도 조회할 수 있음
- 무결성을 위해 사용하지 않는 것이 좋음
Read Committed 커밋된 읽기
- 허용: 팬텀 리드, 반복 가능하지 않은 조회 허용
- 정의: 다른 트랜잭션에서 커밋된 데이터만 조회할 수 있음
- 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능
- 가장 많이 사용되는 격리 수준, 많은 데이터베이스의 default 값
Repeatable Read 반복 가능한 읽기
- 허용: 팬텀 리드
- 정의: 트랜잭션에 진입하기 이전에 커밋된 내용만 조회할 수 있음
- 장점: 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아쥼
- 단점: 새로운 행을 추가하는 것은 막지 않음
- 특징: Undo 공간에 백업해두고 실제 레코드 값을 변경함
- 백업된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제함
- Undo에 백업된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있음
Serializable 직렬화 가능
- 정의: 트랜잭션을 순차적으로 진행. 매우 엄격함
- 특징: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.
- 단점: 교착 상태가 일어날 확률이 높고 성능이 매우 떨어짐 👉 거의 사용 X
- 동시성 가장 낮음, 격리성 가장 높음
Isolation Level | Dirty Read | Non Repeatable Read | Phantom Read |
Read Uncommitted | O | O | O |
Read Committed | X | O | O |
Repeatable Read | X | X | O |
Serializable | X | X | X |
참고
'Computer Science > DB' 카테고리의 다른 글
[DB] 스키마 (1) | 2024.03.26 |
---|---|
[DB] RDBMS와 NoSQL (1) | 2024.03.18 |
[DB] 트랜잭션(2) - 병행 수행과 병행 제어(Concurrency Control) (0) | 2024.03.14 |
[DB] 트랜잭션(1) - 정의, ACID, 상태, 문법, 예외 (0) | 2024.03.13 |
스터디 1회차 예상 질문 (0) | 2024.03.11 |