Dev/MSSQL

03.격리수준(ISOLATION)

비타민드래곤 2024. 4. 29. 22:07
격리수준(ISOLATION)

여러 트랜잭션이 동시에 수행될 때, 한 트랜잭션에서 조회 또는 변경되는 데이터에 대해 다른 트랜잭션에서 접근 가능한 수준을 정하는 것이다.

이러한 격리수준은 잠금(Lock)을 이용하여, 격리수준을 정의한다.

 

격리수준의 필요성

시스템의 특성에 맞게 격리수준을 설정하는것은 무엇보다 중요하다.

  • 격리 수준을 높이면, 동시성은 낮아지고
  • 격리 수준을 낮추면, 동시성은 높아진다.

MSSQL에서는 크게 5가지 격리수준이 존재한다.

  • READ UNCOMMITTED
  • READ COMMITTED(기본)
  • REPEATABLE READ
  • SNAPSHOT
  • SERIALIZABLE

격리수준은 잠금에 의해 구현되며, 지정한 수준에 따라서 잠금 수준이 다르게 적용된다.

Dirty Read

트랜잭션에서 데이터를 읽을 때, 다른 트랜잭션에서 아직 COMMIT 되지 않은 데이터를 읽는 현상이다.

 

Non-Repeatable Read

트랜잭션 내에서 읽은 데이터가 트랜잭션이 종료되기 전에 다른 트랜잭션에서 데이터가 변경되어(COMMIT 된 데이터) 다시 읽었을 때 다른 값을 읽는 현상이다.

 

Phantom Read

트랜잭션 내에서 읽은 데이터가 트랜잭션이 종료되기 전에 다른 트랜잭션에서 데이터를 삽입 또는 삭제하여 다시 읽었을 때 결과가 달라지는 현상이다.

 

READ UNCOMMITTED
  • 다른 트랜잭션에 의해 데이터가 수정되었지만 아직 COMMIT 되지 않은 데이터를 읽을 수 있도록 지정하는 격리 수준
  • 데이터 조회시(SELECT) KEY에 공유잠금(S)을 요청하지 않는다.
  • 고립성 낮음, 동시성 높음
  • Dirty Read/Non-Repeatable Read/Phantom Read
READ COMMITTED
  • 다른 트랙재션에 의해 데이터가 수정되었지만 COMMIT 되지 않은 데이터는 읽을 수 없도록 지정하는 격리 수준
  • SELECT할 때, S-Lock을 소유함(SELECT가 끝나는 동시에 S-LOCK 해제)
  • Non-Repeatable Read/Phantom Read
READ_COMMITTED_SNAPSHOT
  • 해당 설정이 되어있으면, 데이터베이스 엔진은 행 버전 관리를 사용하여 데이터 일관성을 제공한다.
  • 키 공유 잠금 없이도 트랜잭션 내에서 일관성 있게 데이터를 조회할 수 있다.
  • 트랜잭션 내에서 조회될 때 키 또는 RID에 공유 잠금 요청 없이 커밋된 데이터를 읽을 수 있게 된다.
  • 격리 수준을 지정하기 전 ALTER구문을 통하여 데이터베이스를 변경해줘야 한다.
  • COMMIT될 때마다 SNAPSHOT을 찍는다.
REPEATABLE READ
  • COMMIT된 데이터만 읽도록 하며, 현재 트랜잭션이 조회하는 데이터를 다른 트랜잭션에서 수정할 수 없도록 지정하여 한 트랜잭션 내에서 읽은 데이터는 항상 같은 값을 읽게 하는 격리수준
  • 데이터 조회 시 공유잠금을 획득하고 트랜잭션이 완료되기 전까지 반환하지 않음
  • 처음 읽었을 당시에 존재하는 데이터에 대해서만 LOCK걸음
  • 공유잠금을 반환해야 베타잠금을 걸 수 있음
  • Phantom Read
SERIALIZABLE
  • REPEATABLE READ와 같은 특성을 가지지만, 범위 조건 검색 시 해당 범위에 INSERT가 불가능하다.(키 단위가 아닌 키 범위로 잠금)
  • RANGE LOCK은 범위 행 최소값 이전행 최대값 다음행
SNAPSHOT
  • ALLOW_SNAPSHOT_ISOLATION 기능을 활성화하면, 데이터베이스 수준에서 스냅샷 옵션사용 설정