반응형

SELECT 문 사용할 때 with(nolock)를 사용하는 경우가 종종 있다.

with(nolock)을 사용하는 이유는 트랜잭션 격리성 때문인데 해당 내용에 대해 정리 글

 

Transaction Isolation Level(트랜잭션 격리 수준)이란?

  - A 트랜잭션이 실행되고 있을 때 다른 B 트랜잭션의 접근 권한에 대한 수준을 이야기 합니다.

  - 트랜잭션 격리 수준 단계가 높아질수록 격리 수준이 높아지며 데이터 일관성은 높아지지만 동시성은 저하 됩니다.

 

Transaction Isolation 관련 문제점

  - Dirty Read : 커밋되지 않은 데이터를 읽어 해당 트랜잭션이 롤백 되면 오류 데이터를 읽을 수 있는 문제점

  - Non-Repeatable Read : 한 트랜잭션이 반복하여 Read 중일 때 다른 트랜잭션이 접근하여 데이터를 변경하여 커밋하여도 커밋된 결과가 반영 되지 않는 문제점

  - Phantom Read : 한 트랜잭션 안에서 일정 범위 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 문제점

 

Transaction Isolation Level 단계

 

  1. Read Uncommitted

 

        - 트랜잭션 실행 중 다른 트랜잭션이 접근 가능(트랜잭션이 격리되지 않음)

        - A트랜잭션이 데이터를 변경 중 일 때 B트랜잭션이 접근하여 커밋되기전 변경된 데이터를 읽을 수 있음.

        - 만약 커밋되지 않고 A트랜잭션이 롤백되면 B트랜잭션의 결과값은 잘못된 데이터가 됨(Dirty Read 발생)

        - Non-Repeatable Read 발생 가능

        - Phantom Read 발생 가능

 

  2.  Read Committed

 

        - 커밋되기 전 바뀐 데이터를 읽을 수 없음.(Dirty Read 발생 X)

        - Non-Repeatable Read 발생 가능

        - Phantom Read 발생 가능

 

  3.  Repeatable Read

        - 항상 한 트랜잭션의 일관성 있는 데이터 읽기를 보장(Dirty Read, Non-Repeatable Read 발생 X)

        - A트랜잭션 실행 중 B 트랜잭션에서 Insert가 발생 후 동일 조건의 Select문의 A트랜잭션과 B트랜잭션의 결과가 달라짐(Phantom Read 발생)

        - A트랜잭션이 실행 중일 때 다른 트랜잭션이 DB의 내용을 변경해도 서로 영향을 미치지 않는다.

 

  4.  Serializable

        - 가장 높은 격리 수준

        - 트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 트랜잭션이 접근 불가

        - Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 안함.

 

위 내용을 아래 표로 정리하였습니다.

 

 

Dirty Read

Non-Repeatable Read

Phantom Read

Read Uncommitted

O

O

O

Read Committed

X

O

O

Repeatable Read

X

X

O

Serializable

X

X

X

 

* DB별 Default isolation

 

DB

Default isolation

MSSQL

Read Committed

MYSQL

Repeatable Read

ORACLE

Read Committed

 

격리 수준과 with(nolock) 힌트의 관계

    -    With(nolock)힌트는 격리성 제한이 걸린 DataBase Read Uncommitted를 허용한다.(격리성 관련 문제점 발생)

    -    격리성 제약조건 있는 DB에 실시간으로 데이터를 확인할 때 주로 사용한다.

    -    데드락이나 교착상태가 발생하지 않는다.

    -     Rollback이 될 수 있는 데이터까지 읽기 때문에 데이터 일관성은 저하된다.

 

*with(nolock)과 유사한 with(readuncommitted)힌트도 있습니다~!

 

*본문에 사용된 이미지 출처 : https://lng1982.tistory.com/287

반응형

'Database > SQL Server' 카테고리의 다른 글

[MSSQL] 테이블 명세서 쿼리 / SP 명세서  (0) 2022.08.04
SQL 매월 마지막일 출력  (0) 2019.06.20
B-TREE 구조  (0) 2018.11.15
SQL 실행계획  (0) 2018.11.12
[MSSQL] Table Column 속성 변경  (0) 2018.06.25

+ Recent posts