source

NOLOCK과 UNCOMMITED의 차이점은 무엇입니까?

manysource 2023. 6. 19. 21:43

NOLOCK과 UNCOMMITED의 차이점은 무엇입니까?

SQL Server 2012를 사용합니다.

나는 두 개의 쿼리를 작성하지만 다른 것은 무엇입니까?NOLOCK그리고.UnCommitted?

SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)

SELECT lastname, firstname 
FROM HR.Employees with (NoLock)

NOLOCK : 다음과 같습니다.READ UNCOMMITTED(출처 : MSDN)

NOLOCK또는READ UNCOMMITTED더티 읽기가 허용되도록 지정합니다.다른 트랜잭션이 현재 트랜잭션에서 읽은 데이터를 수정하지 못하도록 하는 공유 잠금이 실행되지 않으며, 다른 트랜잭션에서 설정한 배타적 잠금은 현재 트랜잭션이 잠긴 데이터를 읽는 것을 차단하지 않습니다.더티 읽기를 허용하면 동시성이 높아질 수 있지만 다른 트랜잭션에 의해 롤백되는 데이터 수정을 읽는 비용이 발생합니다.

READ UNCOMMITTED그리고.NOLOCK힌트는 데이터 잠금에만 적용됩니다.이러한 쿼리를 포함한 모든 쿼리with READ UNCOMMITTED and NOLOCK힌트: 컴파일 및 실행 중에 Sch-S(스키마 안정성) 잠금을 획득합니다.이로 인해 동시 트랜잭션이 테이블에서 Sch-M(스키마 수정) 잠금을 유지할 때 쿼리가 차단됩니다.

다른 사람들이 언급한 것처럼 기능 면에서 차이가 없습니다.

유일한 차이점은 당신이 지원할 수 있다는 것입니다.WITH(NOLOCK)선택적으로, 일부 테이블에서, 다른 테이블에서는 그렇지 않습니다. READ UNCOMMITTED적용되는NOLOCK세션의 모든 테이블로 이동합니다.

이 작업을 수행할 경우:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id

기능적으로 다음과 같습니다.

SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID

하지만 신청할 수도 있습니다.WITH(NOLOCK)선택적으로:

SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID

후드 아래에서는 동일한 동작을 수행합니다.

READ UNCOMMITTED격리 수준은 SQL Server 내에서 가장 제한이 적은 격리 수준이며, 이는 차단을 줄일 때 개발자들에게 인기 있는 이유이기도 합니다.

NOLOCK뒤에 있는 테이블 힌트는 읽기 커밋되지 않은 분리 수준에서 실행되는 것과 동일한 작업을 수행합니다.

사이의 유일한 차이점은READ UNCOMMITTED격리 레벨은 전체 연결에 대한 잠금 메커니즘을 결정합니다.NOLOCKtable hint는 힌트를 주는 테이블의 잠금 메커니즘을 결정합니다.

명세서 수준에는 차이가 없습니다.

세션 레벨에서 READUNMICTED를 설정할 수 있으며 여기서 SET TRANSOLIDATION LEVEL READ UNMICTED를 작성해야 합니다.

NOLOCK의 경우 테이블 레벨에 이 힌트를 넣어야 하므로 업데이트 트랜잭션에 사용되는 모든 테이블 레벨에 대해 입력해야 합니다.따라서 쿼리에서 테이블이 참조하는 모든 곳에 배치하는 것은 매우 길고 시간이 많이 걸립니다.READ UNCOMMITED의 경우 모든 테이블 수준에 배치할 필요는 없으며 세션 수준이나 쿼리 수준에 배치하기만 하면 쿼리 또는 저장 프로시저의 맨 위에 작성할 수 있습니다.자세한 설명을 위해 작은 데모를 살펴 보겠습니다.여기에서 데이터베이스 기본 분리 수준을 처음 확인하는 중

CREATE TABLE SAMPLETABLE
(
Col1 INT ,
Col2 VARCHAR(100)
)

INSERT INTO SAMPLETABLE(Col1,Col2)
SELECT 1,'Col1'
Union all
SELECT 2,'Col1'

BEGIN TRANSACTION 

Update SAMPLETABLE Set Col2 = 'Value changed' Where col1 =1

Select * from SAMPLETABLE with (nolock)



SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Select * from SAMPLETABLE 

두 쿼리 모두 출력은 1, Col1입니다.

언급URL : https://stackoverflow.com/questions/27198020/what-is-are-difference-between-nolock-and-uncommitted