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
격리 레벨은 전체 연결에 대한 잠금 메커니즘을 결정합니다.NOLOCK
table 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
'source' 카테고리의 다른 글
SQL Server에서 시간을 비교하려면 어떻게 해야 합니까? (0) | 2023.06.24 |
---|---|
서로 다른 Oracle DB 연결 간의 공유 트랜잭션 (0) | 2023.06.19 |
IF 문 내의 "및" 및 "또는" 문제 (0) | 2023.06.19 |
다중값 매개변수의 기본값으로 모두 선택 (0) | 2023.06.19 |
파이썬에서 1900년 이전 날짜에 대해 strftime 유사 함수를 사용할 수 있는 방법이 있습니까? (0) | 2023.06.19 |