- 정의 : 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것
- SERIALIZABLE
- REPEATABLE READ
- READ COMMITTED
- READ UNCOMMITED→ 자동 커밋(Auto Commit)이 false인 상태에서만 발생
→ 격리(고립) 수준이 높은 순서
- 트랜잭션 격리 수준에 따라 발생 할 수 있는 문제점
- 더티 리드(Dirty Read) : 특정 트랜잭션에 의해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제를 말함
- 반복 불가능한 조회(Non-Repeatable Read) : 같은 트랜잭션 내에서 같은 데이터를 여러 번 조회했을 때 읽어온 데이터가 다른 경우를 의미
- 팬텀 리드(Phantom Read) : Non-Repeatable Read의 한 종류로 조회해 온 결과의 행이 새로 생기거나 없어지는 현상
3. SERIALIZABLE
- 가장 단순하고, 엄격한 격리 수준으로 트랜잭션을 순차적으로 진행시킴
- 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않음
→ but, 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어짐 - 순수한 SELECT 작업은 아무런 레코드 잠금 없이 실행되지만, SERIALIZABLE 격리 수준에서는 순수한 SELECT 작업에서도 대상 레코드에 넥스트 키 락을 읽기 잠금(공유락, Shared Lock)으로 검
→ 한 트랜잭션에서 넥스트 키 락이 걸린 레코드를 다른 트랜잭션에서는 절대 추가/수정/삭제할 수 없음
⇒ SERIALIZABLE은 가장 안전하지만 가장 성능이 떨어지므로, 극단적으로 안전한 작업이 필요한 경우가 아니라면 사용해서는 안됨
4. REPEATABLE READ
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리 수준
- MySQL에서 기본으로 사용하며, 이 격리 수준에서는 Non-Repeatable Read가 발생하지 않음
- 트랜잭션이 완료될 때까지 SELECT문이 사용하는 모든 데이터에 shared lock 이 걸림
- SERIALIZABLE과 다르게 행이 추가되는 것을 막지 않아, 팬텀 리드 현상이 발생할 수 있음.
5. READ COMMITTED
- 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용하는 격리 수준
→ 특정 트랜잭션이 이루어지는 동안 다른 트랜잭션은 해당 데이터에 접근할 수 없음 - 특정 트랜잭션에서 데이터가 변경되었으나, 아직 커밋되지 않은 상태라면 다른 트랜잭션에서는 해당 데이터에 접근했을 때 트랜잭션 시작 전 데이터를 읽어옴.
→ 팬텀 리드와 반복 불가능한 조회문제가 발생
→ 커밋이 된 이후에서야 변경된 데이터 값을 읽어올 수 있음
6. READ UNCOMMITTED
- 커밋이 되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회하는 것을 허용하는 격리 수준
- 데이터 부정합 문제가 발생할 확률이 높지만, 성능은 가장 빠름
- 데이터를 어림잡아 집계하는 등의 연산에서 사용하면 좋음
- 데이터베이스의 일관성을 유지하는 것이 불가능함
'CS > Database' 카테고리의 다른 글
[CS] 저장 프로시저(Stored Procedure) (0) | 2023.11.01 |
---|---|
[CS] Redis (1) | 2023.11.01 |
[CS] 트랜잭션 (Transaction) (0) | 2023.11.01 |
[CS] 정규화 (1) | 2023.11.01 |
[CS] 이상, 인덱스 (1) | 2023.10.23 |