nolock 이라는 락힌트를 공부하다가
DB isolation 라는 부분을 공부하고있는데 이 둘의 관계를 이해하기 쉽게 설명해주실 분을 찾고있습니다 ㅠㅠ
DB를 통해서 데이터를 조회하거나(SELECT), 저장/변경/삭제(INSERT,UPDATE,DELETE)를 할 수 있는데
하나의 DB에 여러 사람들이 접속해서 데이터를 조회하거나 변경할 수 있습니다.
그런데 동시에 여러 사람이 하나의 DB에 접속하다보면 동시성의 문제가 발생합니다.
예를 들면, 어떤 접속에 의해 데이터가 변경되고 있는데 변경되고 있는 바로 그 짧은 순간에
누군가가 데이터를 읽을 때 아직 변경이 완료되지 않은 정확하지 않은 데이터를 읽어온다든가 하는 등의 경우가 발생할 수 있습니다.
이런 문제를 방지하기 위해 MS SQL에서는 하나의 접속이 특정 작업을 하는 동안 다른 작업을 못하도록 isolation(일관성)이 걸리도록 되어있습니다.
즉, 하나의 접속이 데이터를 변경하는 작업을 완전히 끝낼 때까지 다른 접속이 데이터를 읽을 수 없도록 하는 것이 기본 값인데
이 수준의 isolation을 READ COMMITED라고 합니다.
다시 말해, 데이터가 COMMITED(변경 작업 완료)된 경우에만 조회를 할 수 있도록 하고
그렇지 않으면 COMMITED되기 전까지는 접속에 LOCK을 걸어서 기다리게 만듭니다.
그런데 때로는 데이터의 일관성과 관계없이 기다리지 않고 빨리 데이터를 읽어오기를 원하는 경우가 있습니다.
이 때 제공되는 옵션이 NOLOCK입니다.
SQL 쿼리를 실행할 때 WITH NOLOCK라는 옵션을 주면 데이터의 일관성과 상관없이 기다리지 않고 데이터를 조회할 수 있습니다.
참고로 WITH NOLOCK 옵션은 현재 접속한 쿼리에 대해서만 적용되는 옵션이고
만약 전체 접속에 대해 READ COMMITED를 해제하고 싶으면 아래와 같이 시스템 쿼리를 실행해서 READ UNCOMMITED로 바꿀 수 있습니다.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DB를 통해서 데이터를 조회하거나(SELECT), 저장/변경/삭제(INSERT,UPDATE,DELETE)를 할 수 있는데
하나의 DB에 여러 사람들이 접속해서 데이터를 조회하거나 변경할 수 있습니다.
그런데 동시에 여러 사람이 하나의 DB에 접속하다보면 동시성의 문제가 발생합니다.
예를 들면, 어떤 접속에 의해 데이터가 변경되고 있는데 변경되고 있는 바로 그 짧은 순간에
누군가가 데이터를 읽을 때 아직 변경이 완료되지 않은 정확하지 않은 데이터를 읽어온다든가 하는 등의 경우가 발생할 수 있습니다.
이런 문제를 방지하기 위해 MS SQL에서는 하나의 접속이 특정 작업을 하는 동안 다른 작업을 못하도록 isolation(일관성)이 걸리도록 되어있습니다.
즉, 하나의 접속이 데이터를 변경하는 작업을 완전히 끝낼 때까지 다른 접속이 데이터를 읽을 수 없도록 하는 것이 기본 값인데
이 수준의 isolation을 READ COMMITED라고 합니다.
다시 말해, 데이터가 COMMITED(변경 작업 완료)된 경우에만 조회를 할 수 있도록 하고
그렇지 않으면 COMMITED되기 전까지는 접속에 LOCK을 걸어서 기다리게 만듭니다.
그런데 때로는 데이터의 일관성과 관계없이 기다리지 않고 빨리 데이터를 읽어오기를 원하는 경우가 있습니다.
이 때 제공되는 옵션이 NOLOCK입니다.
SQL 쿼리를 실행할 때 WITH NOLOCK라는 옵션을 주면 데이터의 일관성과 상관없이 기다리지 않고 데이터를 조회할 수 있습니다.
참고로 WITH NOLOCK 옵션은 현재 접속한 쿼리에 대해서만 적용되는 옵션이고
만약 전체 접속에 대해 READ COMMITED를 해제하고 싶으면 아래와 같이 시스템 쿼리를 실행해서 READ UNCOMMITED로 바꿀 수 있습니다.