DEV/DB & SQL

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

무사뎀벨레 2022. 9. 7. 15:10

 

 

 

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) 은 정확성이 필요한 경우에는 사용을 삼가는 것이 좋습니다.

반응형