[MSSQL] with(nolock)

SQL 2014. 4. 30. 13:20


출처 : http://blog.naver.com/waws01/60206664261





With(nolock) 은 많이 쓰는 힌트이다. 하지만 이 개념에 대해서 정확히 알고 쓴다기 보다는 대부분이 원래 그렇게들 써서 쓰고 있다는 대답이 대부분이며, 그냥 이라는 대답도 많다. 

 

이전에 필자가 다른 블로그에서 퍼온 스크랩이 있다.


http://blog.naver.com/waws01/60184099145

위의 설명은 말로 설명이 되어 있는데 설명이 잘되어 있다. 위의 설명을 읽고 아래의 필자의 테스트를 번갈아 가면서 보면 이해가 쉽다.

 

이번 포스트에서는 with(nolock)힌트에 대해서 알아 보도록 하자.

 

With(nolock)힌트는 '커밋되지 않은 읽기'를 허용한다. 즉 읽기 작업 시에 잠금을 얻지 않아서 조회하는 테이블에 단독 잠금이 걸려 있어도 기다리지 않는다. 이렇게 보면 상당히 좋은 기능으로 보인다. 잠금을 걸지 않으므로 '데드락'이 발생하거나 '교착상태'가 발생하지 않아 좋은 점만 있는 듯 싶다. 하지만 Rollback이 될 수도 있는 데이터까지 읽기 때문에 데이터의 일관성이 떨어질 수 있다.

 

우선 테스트를 위해서 Northwind 데이터베이스의 Employees 테이블을 필자의 개인 데이터베이스로 복사했다.

USE WorkDB

GO

 

SELECT * INTO dbo.Employees FROM Northwind.dbo.Employees

GO

 

아래의 쿼리를 실행해 보자.

SELECT EmployeeID,LastName FROM dbo.Employees

 

우리가 바꾸고자 하는 사람은 King이다. EmployeeID가 7번에 해당한다.


 

이제 업데이트 문을 실행해서 King을 바꿔보도록 하자. 하지만 여기서 중요한것은 우리는 BEGIN TRAN을 선언해서 이것을 

트랜잭션에 걸리도록 하겠다.

 

BEGIN TRAN

 

UPDATE dbo.Employees

SET LastName = 'Jenas'

WHERE EmployeeID = 7

 

아직 현재 7번의 King은 Jenas로 바뀌지 않았다. 이제 세션을 하나 더 연결해서 조회 해보자.

SELECT EmployeeID,LastName FROM dbo.Employees

 

아마도 교착상태가 발생 할 것이다. 계속 쿼리가 실행중으로 나올 것이다.


 

그렇다면 이제 WITH(NOLOCK)을 추가해서 실행해보자.

SELECT EmployeeID,LastName FROM dbo.Employees WITH(NOLOCK)

 


 

7번이 Jenas로 바뀌어 있다. 

이게 바로 WITH(NOLOCK)힌트다. 

하지만 여기서 중요한 것이 있다. 아직 1번 세션은 COMMIT을 선언하지 않았다. 그런데 2번 세션의 사용자는 7번이 원래 Jenas로 알고 있다. 그렇다면 데이터의 일관성이 떨어진다. 왜? 1번 세션의 사용자가 이 7번을 King으로 다시 ROLLBACK한다면?

 

2명의 사용자는 7번의 데이터를 서로 다르게 알게 되는 샘이다. 

 

그러므로 이 WITH(NOLOCK)을 무조건 적용하는 것이 아닌 경우에 따라서 적절히 사용해야 한다. 

 


'SQL' 카테고리의 다른 글

[MSSQL] 커서 (CURSOR)  (0) 2014.07.23
[MSSQL] 테이블 검색  (0) 2014.07.09
[MSSQL] 테이블 컬럼 및 프로시저 특정단어 검색  (0) 2014.04.21
[MSSQL] UNPIVOT  (0) 2014.03.07
[MSSQL] 공백 제거  (0) 2014.02.10
Posted by 요지
,