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 |
댓글