msSql NOLOCK 사용법, WITH(NOLOCK)

728x90

MS SQL WITH(NOLOCK) 사용법을 정리해 봅니다.

SELECT시 공유잠금을 사용하기 위해 처리하는 방식입니다. 다시 말해 변경하는 데이터를 변경하고 나서 변경된 자료를 SLELECT 할 것인지 옵션을 설정하여 최신 데이터를 볼지 아니면 수정된 이전에 데이터를 볼 것인지 결정하는 옵션이라고 생각하시면 됩니다.

 

기본으로는 LOCK상태로 처리가 되기 때문에 SELECT를 하면서 WITH(NOLOCK) 옵션 설정을 하여 무조건 데이터를 조회할 수 있게 처리하면 됩니다.

 

LOCK상태 DML(INSERT, UPDATE, DELETE) 작업 중인 데이터 또 테이블에 SELECT 할 경우 해당 작업이 끝이 나야 SELECT 할 수 있다는 의미입니다.

 

만일 이렇게 사용한다면 DB성능이 떨어진다고 볼 수 있는거죠. Deadlock이 발생될 수 있다 이거죠

그래서 SELECT시에 WITH(NOLOCK) 옵션을 필수로 적용하여 만들어야 한다는 의미가 되겠죠.

 

사용방법

1. 단독으로 테이블 뒤에 선언하면 된다.

SELECT * FROM TBITEM WITH(NOLOCK);

 

2. JOIN으로 만들어진 경우에는 각각 테이블별로 옵션을 사용하여 적용해주어야 한다.

SELECT *

FROM TBITEM A WITH(NOLOCK)

INNER JOIN TBITEM2 B WITH(NOLOCK) ON A.ITEM = B.ITEM

 

3. BEGIN TRAN으로 UPDATE처리 작업이 완료 될때까지 SELECT 처리를 기다리고 있게 된다.

BEGIN TRAN

UPDATE TBITEM

       SET ItemName = '라면1'

  Where   item = 'A1'

 

WITH(LOCK) 상태에서는 UPDATE 처리가 끝이 날 때까지 기다리고 있게 됩니다.

SELECT * FROM TBITEM Where item = 'A1';

 

WITH(NOLOCK) 상태에서는 기다리지 않고 실행이 됩니다.

SELECT * FROM TBITEM Where item = 'A1' WITH(NOLOCK);

 

모든 방식에는 장단점이 있겠지만 WITH(LOCK) 상태에서는 전체적인 DB 부하가 많이 발생하여 DB LOCK이 생길 수 있기 때문입니다. 그러나 업무상 어쩔 수 없이 사용해야 하는 경우가 있기 때문에 잘 판단해서 사용을 해야겠습니다.

 

 

반응형