본문 바로가기
몰라 컴퓨터 일반/데이터베이스

트랜잭션 격리수준(DB Isolation Level)

by 몰라닉네임 2024. 10. 18.

 

Dirty Read

Non Repetable read(반복 가능하지 않은 읽기)현상

Repeatable Read(반복 가능한 읽기)

Phantom Read(유령읽기)

-트랜잭션 격리 수준 4단계
1. Read Uncommitted : 커밋 무시하고 중간에 읽는다, Dirty Read
2. Read Committed : 커밋된 데이터만 읽는다, Non-Repeatable Read 
3. Repeatable Read : 한 트랜잭션에서 여러번 읽어도 동일함 보장, Phantom Read
4. Serializable : 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.

 

 

 

무결성과 정합성

- 무결성(Integrity) : 데이터 값이 정확한 상태인가? 이상한 값이 아닌가?

- 정합성(Consistency) : 모든 트랜잭션에서 같은 데이터 값이 모순 없이 일치한가 ?

 

트랜잭션 격리 수준

1. Read Uncommitted

커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜 잭션을 읽는 것을 허용하는 것으로 격리 수준이 가장 낮다.

아래 참고하면 트랜잭션 A 가 커밋되지 않은 상태에서 트랜잭션 B가 DB를 조회했다. 이때 커밋되지 않고 변경된 트랜잭션 A의 값을 조회하는 것을 알 수 있다. 

 

Read Uncommitted

  • Read Uncommitted 레벨에서는 Dirty-Read 현상이 발생한다.
  •  Dirty-Read란 트랜잭션 작업이 완료되지 않은 미완성 데이터를 읽는 것 (트랜잭션 A가 만약 트랜잭션을 끝마치지 못하고 Roll Back한다면 트랜잭션 B는 무효가 된 데이터 값을 읽는 것)을 얘기한다. 

 

2. Read Committed 

  • Oracle DBMS에서 기본으로 사용되는 격리 수준

커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능하다. 

트랜잭션이 이루어지는 동안에는 다른 트랜잭션은 해당 데이터에 접근이 불가능 

Read Committed

 

아직 Commit되지 않은 상태라면 트랜잭션 시작 전 값을 읽어오고 커밋하면 변경된 데이터를 읽어온다.

  • Non-Repeatable Read, Phantom Read 현상이 발생
  • Non-Repeatable Read는 위의 그림에서 보듯이 트랜잭션 B내에서 Select 를 두번 수행했지만 두 값이 다른 값으로 나오는 데이터 불일치 문제이다.

3. Repeatable Read 

  • MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준이다.

마찬가지로 Commit 이 완료된 데이터만 읽을 수 있다.

Read Committed와 다른 점은 한 트랜잭션이 조회한 데이터는 트랜잭션이 종료될 때 까지 다른 트랜잭션이 변경하거나 삭제하는 것을 막으므로 한 번 조회한 데이터는 반복적으로 조회해도 같은 값을 반환한다. 

Repeatable Read

  • Phantom Read 발생한다.
  • Phantom Read 란 한 트랜잭션에서 특정 레코드가 보였다가 안보였다가 하는 현상이다, 한 트랜잭션에서 값을 읽었을 때, 첫번째 때는 안보이던 레코드가 두번째 조회에서는 보이는 현상이다.

 

4. Serializable

한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.

  • 트랜잭션의 성질인 ACID를 엄격하게 지키기 때문에 성능은 가장 떨어진다. 
  • 단순 SELECT 문으로도 트랜잭션이 커밋될 때까지 모든 데이터에 LOCK이 설정되어 다른 트랜잭션에서 해당 데이터를 변경할 수 없게 된다.
  Dirty Read Non-Repeatable Read Phantom Read
READ_UNCOMMITTED O O O
READ_COMMITTED O O
REPEATABLE_READ X X O
SERIALIZABLE X X X

 

 

 

참고

 

'몰라 컴퓨터 일반 > 데이터베이스' 카테고리의 다른 글

데이터베이스  (0) 2024.10.18
정규화  (0) 2024.05.24