목차
📌 트랜잭션 격리수준이란
트랜잭션 격리 수준이란 동시에 여러개의 트랜잭션 처리를 할 때 각 트랜잭션끼리 얼마나 고립 되어 있는지를 나타낸다.
데이터 베이스에서 여러개의 트랜잭션이 공유 자원
에 접근해 작업(CRUD) 을 할때 자원의 일관성
을 지키기 위해 트랜잭션 작업을 얼마나 고립시킬지를 나타냅니다.
격리 수준이 높을 수록 무결성은 강해지지만, 성능이 저하됩니다. 그렇다고 격리수준을 낮추면 성능과 관련된 동시성은 높아지지만 데이터 무결성이 깨질 수 있어 데이터 성격에 따라 적절한 설정이 필요합니다.
📋 트랜잭션 격리 수준
1. Read Uncommited - 커밋되지 않은 데이터만 읽기
현재 트랜잭션에서 일어난 변경 사항이
Commit
이나Rollback
되지 않아도 다른 트랜잭션에서 변경된 값을 읽을 수 있다.
Dirty Read
현상이 발생- Commit 이 일어나기 전에 발생한 변경사항을 다른 Transaction 에서 조회할 수 있는 현상
2. Read Commited - 커밋된 데이터만 읽기
다른 트랜잭션에서 일어난 변경 사항이 Commit되지 않았으면
Undo 영역
에 저장된 데이터를 읽어온다.
- Dirty Read 가 발생하지 않는다.
Non-Repeatable Read
현상이 발생한다.- 한 트랜잭션 내에서 같은 데이터를 두번 조회 했을 때 이전 데이터와 일치 하지 않는 데이터 불일치 현상
3. Repeatable Read - 반복적으로 동일한 데이터를 읽기
트랜잭션 ID 를 이용해 현재 트랜잭션보다 이전에 일어난 변경사항 만 조회할 수 있다.
즉, 트랜잭션 내에서 조회한 데이터는 트랜잭션 종료 시점 까지 같은 데이터를 반환한다.
- Phantom Read 가 발생한다.
- 한 트랜잭션 내에서 같은 데이터를 두번 조회 했을 때 이전에 존재하지 않았던 값이 다시 조회했을 때 나타나는 현상
- Repeatable Read 의 경우 특정행의 수정과 삭제가 일어나더라도 일관성을 유지하지만, 특정 행이 아닌 테이블에 새로운 행의 삽입은 막을 수가 없어 발생하는 문제입니다.
- 트랜잭션 도중에
데이터 삽입(Insert)
을 허용하기 때문에 발생하는 문제 - REPETABLE READ 이하에서만 발생한다
4. Serializable
가장 높은 격리 수준, 읽기 작업에도 Lock이 걸리게 된다.
- 데이터를 조회할때
Shared Lock
을 획득해야만 조회할 수 있다. - 데이터를 변경할때는
Exclusive Lock
을 획득해야만 변경할 수 있다.
🚧 격리 수준에 따른 문제
Dirty Read | Non-Repeatable Read | Phantom Read | |
---|---|---|---|
Read Uncommited | 발생 | 발생 | 발생 |
Read Commited | 발생하지 않음 | 발생 | 발생 |
Repeatable Raead | 발생하지 않음 | 발생하지 않음 | 발생 |
Serializable | 발생하지 않음 | 발생하지 않음 | 발생하지 않음 |
Dirty Read (더러운 읽기)
- 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 행위
Non-repeatable Read (반복 불가능한 읽기)
- 같은 쿼리를 여러 번 실행했을 때 결과가 달라지는 현상.
Phantom Read (팬텀 리드)
- 동일한 조건으로 여러 번 조회할 때 새로운 row 가 나타나는 현상.