본문 바로가기
컴퓨터관련/MS-SQL

[MS-SQL]WITH NOLOCK 설명 및 사용법

by 빛과 어둠사이 2019. 8. 8.
728x90
반응형
SMALL

MSSQL의 경우,

기본적으로 제공하는 격리수준은

READ_COMMITED 입니다.

즉, AUTO COMMIT 라고 생각하시면 되십니다.


설정 변경은 가능합니다.

하지만 기본적으로는 저렇게 되고 있습니다.


그렇다보니 UPDATE, INSERT 등을 하면서

테이블이 잠기게 되었을 때,

SELECT를 하게 된다면

블락이 걸리게 됩니다.


이럴 때는 DB의 성능이 떨어지고,

데드락이 걸리게 되어 결과가 안나오는 경우가 발생할 수도 있습니다.


이럴 때를 피하기 위해 사용할 수 있는 방법이

WITH (NOLOCK) 입니다.

이번에는 WITH (NOLOCK)에 대해서 

확인해보도록 하겠습니다.



1. WITH (NOLOCK) 이란?

WITH NOLOCK은 커밋되지 않은

일기를 허용하겠다는 것입니다.

읽기 작업 시,

조회하는 테이블이 잠겨있어도

기다리지 않겠다는 것입니다.

데드락이 발생하거나,

교착상태가 발생되지 않는다는

장점을 가지고 있습니다.


2. 사용법

사용하는 방법은 간단합니다.

FROM 절에 테이블을 쓰고,

그 옆에 WITH (NOLOCK)를 입력해주면 됩니다.


예를 들어보도록 하겠습니다.

select * from test_member;

위 쿼리를 돌려서

아래처럼 데이터가 있는 것을 확인할 수 있습니다.



이제 해당 테이블에 대해서

락이 발생하도록

트랜잭션을 발생시켰습니다.

BEGIN TRANSACTION
UPDATE test_member                               
SET member_name = '변경이름'
WHERE id = 'aaa'

위처럼 해서 트랜잭션을 걸어

락을 발생시켰습니다.

그리고 첫번째 쿼리를 실행시키면

아래처럼 됩니다.



두번째 쿼리에서처럼

트랜잭션이 걸려서

해당 트랜잭션이 종료될 때 까지

무한정 대기를 하게 되는 것입니다.


이번에는 WITH NOLOCK를 넣고

돌려보도록 하겠습니다.

select * from test_member WITH (NOLOCK)

위처럼 돌리게 되면

아래처럼 결과가 나옵니다.



트랜잭션이 걸려 있어서 락이 발생해도

조회가 되는 것입니다.



3. WITH (NOLOCK)의 문제점

2번에서 확인한 바와 같이

트랜잭션이 걸려있고,

락이 걸려있어도

조회를 할 수 있는 장점이 있습니다.


하지만 문제점도 있습니다.

두번째에 트랜잭션을 발생시켰던 쿼리를

ROLLBACK를 해 보았습니다.

그리고 조회를 하면 

다음과 같은 결과가 나옵니다.



ROLLBACK를 했기 때문에

aaa에 대한 값이

변하지 않은 것을

확인할 수 있습니다.


이렇게 되면 2번에서 WITH NOLOCK를 걸어

데이터를 조회했던 것과

값이 다르게 됩니다.

데이터에 정합성이 떨어질 수 있는 것입니다.


그렇기 때문에 무조건 적으로

WITH NOLOCK를 사용하는 것은

안좋은 행동입니다.

상황에 맞추어서

사용을 해주시면 되십니다.



이상으로 SQL SERVER에서 WITH NOLOCK 설명 및 사용법에 대한 정리였습니다~


728x90
반응형
LIST