본문 바로가기
DEV/DB & SQL

[MSSQL] WITH(NOLOCK) - 테이블 잠금 해제

by 무사뎀벨레 2022. 9. 7.

 

 

 

LOCK이란?


MSSQL 데이터베이스의 테이블을 업데이트하는 경우에는 해당 테이블은 잠겨있게 됩니다.

이러한 상태를 LOCK이라고 하는데, LOCK이 걸리게 되는 이유는 MSSQL의 기본 격리 수준이 Read Committed 이기 때문입니다.

 

INSERT, UPDATE, DELETE 와 같은 DML 작업 중인 ROW 나 TABLE에 SELECT 하는 경우, 진행 중인 DML 작업이 끝나야 SELECT 가 가능합니다.

 

즉, 완전히 COMMIT 된 데이터만 읽게됩니다. 따라서, LOCK이 걸려있는 동안 SELECT 작업을 수행하게 되면 이 SELECT 작업이 후순위로 밀려나게 되고 데이터베이스의 성능이 떨어질 수 있습니다.

 

 

 

 

 

 

LOCK ↔ WITH(NOLOCK)


사용자 입장에서는 SELECT 작업이 후순위로 밀리는 것을 방지하는 것WITH(NOLOCK)의 사용 목적이라고 할 수 있습니다.

 

WITH(NOLOCK)의 격리 수준(Isolation Level)은 Read Uncommitted와 같다고 보면 되는데, SELECT 할 ROW 또는 TABLE 이 잠겨있어도(작업 중이어도) 기다리지 않고 조회 (Dirty Read) 하겠다는 의미입니다.

 

이를 통해 조회 성능이 올라가고, 데드락(Deadlock)을 방지할 수 있습니다.

 

사용 방법은 아래와 같이 프롬 절의 마지막에 WITH(NOLOCK)을 붙여줍니다.

SELECT * 
FROM a_table WITH (NOLOCK)

 

 

 

 

WITH(NOLOCK) 사용의 문제점


하지만 Committed 되지 않은 데이터를 읽기 때문트랜잭션이 Rollback 될 경우, 잘못된 데이터를 읽게 될 수도 있습니다.

 

즉, SELECT 하는 데이터에 대한 "정합성"이 떨어지게 되는 문제점이 발생합니다.

 

그렇기 때문에, WITH(NOLOCK) 은 정확성이 필요한 경우에는 사용을 삼가는 것이 좋습니다.

반응형

'DEV > DB & SQL' 카테고리의 다른 글

[MSSQL] Table과 Column의 Description 추가, 수정하기  (2) 2022.12.16
SQL에서의 WHERE 1=1  (2) 2022.12.13
날짜, 시간 연산(DATEADD)  (2) 2022.06.02
varchar와 nvarchar의 차이  (6) 2022.04.29
테이블 수정(ALTER TABLE)  (6) 2022.04.14

댓글