SQL/MSSQL

[MSSQL] NOLOCK에 대해서 알아보자 (SELECT)

가든가든 2023. 8. 3. 11:55
728x90

MSSQL은 기본적으로 SELECT (조회) 할때 공유잠금이 걸립니다.

공유잠금에 대해 예를 들자면..

SELECT가 실행중인데 만약 insert, update, delete 실행하게 되면 SELECT 작업이 모두 끝날때까지 lock이 걸린다.
하지만 SELECT 하면서 테이블 뒤에 (nolock) 또는 with(nolock)을 주면 공유잠금을 걸지 않고 바로 조회를 할 수 있다!

SELECT * FROM table1 (nolock)
또는
SELECT * FROM table1 WITH(nolock)

NOLOCK 이란?

(nolock) 또는 with(nolock)은 SQL Server에서 사용되는 힌트(Hint) 중 하나이며,
다른 트랜잭션에 의해 수정되는 데이터에 대해 락(Lock)을 걸지 않고 읽기 작업을 수행하며 이로 인해 다른 트랜잭션과 충돌을 피하고 빠르게 데이터 조회를 할 수 있습니다.

⚠ 하지만 NOLOCK을 사용하면 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있으며 또한 다른 트랜잭션이 롤백되면 읽은 데이터도 무효화될 수 있습니다. 해당 사항들을 고려해야 하며 이것을 Dirty Read라고 합니다.

ETC 꿀팁

매번 테이블에 with(nolock)을 입력하기 귀찮다면 프로시저 생성할때

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

구문을 추가하면 with(nolock)을 추가 안해도 된다!

CREATE PROCEDURE 프로시저_이름1
AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
    SELECT * FROM table1
END
728x90