Isolation Level : 트랜잭션 격리 수준

eunsol Jo·2021년 11월 15일
0

⚙️  os

목록 보기
4/4
post-thumbnail

Isolation Level?

: 여러 트랜잭션을 동시에 처리시, 트랜잭션의 결과를 다른 트랜잭션에게 어떻게 노출 할지 결정 하는것

  • 동시성데이터 무결성을 적절하게 설정해야한다. (동시성이 올라갈 경우, 데이터 무결성문제가 발생할 수 있다.)
  • 레벨이 높을수록 비용이 높아진다.

Transaction? 사람이 설계한 논리적인 작업 단위

원자성 (Atomicity) : 모두 반영되던가, 아니면 전혀 반영되지 않아야함.
일관성 (Consistency) : 작업 처리 결과가 항상 일관성이 있어야함. (진행중에 DB변화가 있어도 처음에 참조한 DB로 진행되어야함.)
독립성 (Isolation) : 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없음.
지속성 (Durability) : 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 함.

트랜잭션 격리수준

: 레벨이 낮을 수록 고립정도는 낮고, 성능은 높다.

① READ UNCOMMITTED (level0)

  • SELECT 가 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 Level
    = (아직 커밋되지 않은) 트랜잭션의 변경내용이 데이터를 다른 트랜잭션이 읽는것을 허용
  • 데이터 정합성 문제로 사용을 권장하지 않음 → Dirty Read

② READ COMMITTED (level1, default)

  • SELECT 가 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 Level
    = (아직 커밋되지 않은) 트랜잭션의 변경내용이 데이터를 다른 트랜잭션이 읽는것을 비허용
  • 대부분의 RDB에서의 기본 격리수준 (실제로 많이 사용됨)
  • 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

③ REPEATABLE READ (level2)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level
    → 그러나, 새로운 로우 추가는 제한하지 못하여 예를들어 SELECT * FROM TABLE로 전체 조회시 다른 트랜재션에서 추가한 로우가 조회되는 Phantom Read 발생가능하다.
  • 트랜잭션이 범위 내에서 조회한 데이터의 내용이 항상 동일함을 보장한다.
  • Undo영역에 백업된 데이터를 읽어오는것으로 레코드가 많아지면 성능에 영향을 줄 수 있다.

④ SERIALIZABLE (level3)

  • 가장 강력한 트랜잭션 격리수준
  • 트랜잭션을 순차적으로 처리한다 → 동시성이 현저히 떨어지며, 극단적인 안전한 작업이 아니면 사용되지 않는다.

Lock? 데이터의 일관성을 보장하기 위한 방법

  1. Exclusive Lock(배타적 Lock 또는 Write lock)
    어떤 트랜잭션에서 데이터를 변경하고자 할 때(ex . 쓰고자 할 때) 해당 트랜잭션이 완료될 때까지 해당 테이블 혹은 레코드(row)를 다른 트랜잭션에서 읽거나 쓰지 못하게 하기 위해 Exclusive lock을 걸고 트랜잭션을 진행시키는 것이다.
    → exclusive lock에 걸리면 shared lock을 걸 수 없다. (shared lock은 아래에서 설명)
    → exclusive lock에 걸린 테이블,레코드등의 자원에 대해 다른 트랜잭션이 exclusive lock을 걸 수 없다.
  2. Shared Lock(공유 Lock 또는 Read Lock)
    어떤 트랜잭션에서 데이터를 읽고자 할 때 다른 shared lock은 허용이 되지만 exclusive lock은 불가하다.
    쉽게 말해 리소스를 다른 사용자가 동시에 읽을 수 있게 하되 변경은 불가하게 하는 것이다.
    → 어떤 자원에 shared lock이 동시에 여러개 적용될 수 있다.
    → 어떤 자원에 shared lock이 하나라도 걸려있으면 exclusive lock을 걸 수 없다.

트랜잭션 격리수준 문제점

Isolation LevelDirty ReadNon-Repeatable ReadPhantom Read
Read UncommittedOOO
Read Committed-OO
Repeatable Read--O
Serializable---

1. Dirty Read

  • 커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
  • 어떤 트랜잭션에서 아직 실행이 끝난지 않은 다른 트랜잭션에 의한 변경 사항을 보게 되는 되는 경우

2. Non-Repeatable Read

  • 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때, 두 쿼리의 결과가 상이하게 나타나는 비 일관성 현상
  • 한 트랜잭션이 수행중일 때 다른 트랜잭션이 값을 수정 또는 삭제함으로써 나타난다.

3. Phantom Read

  • 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때, 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상
  • 한 트랜잭션이 수행중일 때 다른 트랜잭션이 새로운 레코드가 삽입함으로써 나타난다.

Reference

profile
Later never comes 👩🏻‍💻

0개의 댓글