🔎 트랜잭션의 격리수준이란 ?
- 트랜잭션의 4가지 특징, ACID중 고립성(isolation)을 보장하기 위해서는 트랜잭션은 분리 되어야 한다.
- 트랜잭션 격리수준이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다.
격리수준은 크게 아래의 4개로 나뉜다.
- READ UNCOMMITTED (커밋되지 않은 읽기)
- READ COMMITTED (커밋된 읽기)
- REPEATABLE READ (반복 가능한 읽기)
- SERIALIZABLE (직렬화 가능)
👉 1. READ UNCOMMITTED (커밋되지 않은 읽기)
각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
- 정합성에 문제가 많음
- Dirty Read 발생
❓ Dirty Read란?
트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
ex) 업데이트만 하고 commit을 하지 않아도 변경된 데이터가 보인다
👉 2. READ COMMITTED (커밋된 읽기)
COMMIT 된 데이터만 읽습니다.
- RDB에서 대부분 기본적으로 사용하고 있는 격리 수준 (PostgreSQL, Oracle, Microsoft SQL Server, IBM Db2)
- NON-Repeatable 발생
❓ NON-Repeatable란?
하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 REPEATABLE READ 정합성에 어긋나는 것
- 예시
- B에서 ‘Number’ 테이블을 조회 해서 1이 나왔다.
- A 가 ‘Number’ 테이블에 1을 2로 update 후 커밋을 한다.
- B에서 다시 테이블을 조회했을 때, 2가 나온다.
- 트랜잭션 B 내부에서 동일한 SELECT 쿼리에서 서로 다른 결과가 반환되어 데이터 정합성이 어긋하게 된다.
👉 3. REPEATABLE READ (반복 가능한 읽기)
자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT 이 된 데이터만 읽습니다.
- MySQL과 MariaDB 가 기본으로 사용하는 격리 수준이다.
- MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
- PHANTOM READ 발생
🔎 3.1 추가 설명
MySQL 뿐만이 아니라 여러 DB들이 이 방식을 사용한다.
모든 트랜잭션은 번호를 갖진다. undo 영역에서는 트랜잭션 번호를 함께 보관한다.
- 트랜잭션은 자신보다 낮은 트랜잭션 번호에서 커밋된 데이터만 읽습니다.
- 트랜잭션 A는 10번이고 Number를 조회하여 1이 나옴
- 트랜잭션 B에서 Number를 2로 변경하여 커밋함 (11번)
- 트랜잭션은 다시 조회 sql을 보내서 커밋하지 않는 이상 1을 조회함
❓ PHANTOM READ란?
한 트랜잭션에서 동일한 쿼리를 여러 번 실행했을 때, 다른 트랜잭션이 데이터를 추가하거나 삭제함으로 인해 결과가 달라지는 현상
- 예시
- 트랜잭션 A가 시작됩니다 (트랜잭션 번호: 10).
- Number 값을 조회하면 1이 반환됩니다 (트랜잭션 A가 시작되기 전에 커밋된 데이터 기준).
- 트랜잭션 B가 시작되고 (트랜잭션 번호: 11), Number 값을 2로 변경하고 COMMIT합니다.
- 이제 데이터베이스의 최신 Number 값은 2가 됩니다.
- 트랜잭션 A가 다시 Number를 조회합니다.
- 트랜잭션 A는 트랜잭션 10 이전의 데이터 스냅샷을 참조하므로 여전히 Number 값이 1로 보입니다.
- 이는 트랜잭션 A가 종료(커밋 또는 롤백)될 때까지 동일한 값을 유지합니다.
- 트랜잭션 A가 시작됩니다 (트랜잭션 번호: 10).
간단히 조회한 후에 수정 됬음 → 조회 query가 커밋되기 전까지 수정 되기 전 값으로 보임
👉 4. SERIALIZABLE (직렬화 가능)
데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회
- 단순하지만 가장 엄격한 격리 수준
- 문제가 발생하지 않음
- 성능 이슈로 데이터베이스에서 거의 사용하지 않는다.
참고
https://mangkyu.tistory.com/299
https://velog.io/@yujiniii/데이터베이스-트랜잭션-격리-수준
https://akasai.space/db/about_isolation/
'Database' 카테고리의 다른 글
| 슬로우 쿼리를 잡자! EXPLAIN, EXPLAIN ANALYZE (1) | 2024.11.13 |
|---|---|
| DBMS의 핵심? 옵티마이저 (1) | 2024.11.06 |
| VARCHAR와 TEXT의 저장방식 차이 (1) | 2024.10.22 |
| SQLite 사용기 (0) | 2024.10.21 |