IsolationLevel에서 공유 잠금이 발행되었습니다.


10

IsolationLevel.ReadUncommitted를 사용하면 쿼리에서 잠금이 발생하지 않아야한다는 것을 읽었습니다. 그러나 이것을 테스트했을 때 다음과 같은 잠금을 보았습니다.

Resource_Type : HOBT 요청
_ 모드 : S (공유)

HOBT 자물쇠 란 무엇입니까? HBT (힙 또는 이진 트리 잠금)와 관련이 있습니까?

왜 여전히 S 잠금을 얻습니까?

격리 수준 스냅 샷 옵션을 설정하지 않고 쿼리 할 때 공유 잠금을 피하려면 어떻게해야합니까?

SQLServer 2008에서 이것을 테스트하고 있으며 스냅 샷 옵션이 꺼져 있습니다. 쿼리는 선택 만 수행합니다.

SQL Server가 잠금 쿼리에 표시하지 않는 것처럼 보이지만 Sch-S가 필요하다는 것을 알 수 있습니다. 여전히 공유 잠금을 어떻게 발행합니까? 에 따르면 :

트랜잭션 격리 수준 설정 (Transact-SQL)

READ UNCOMMITTED레벨 에서 실행중인 트랜잭션은 다른 트랜잭션이 현재 트랜잭션에서 읽은 데이터를 수정하지 못하도록 공유 잠금을 발행하지 않습니다.

그래서 나는 약간 혼란 스럽다.

답변:


13

HOBT 잠금이란 무엇입니까?

클러스터형 인덱스가없는 테이블의 B- 트리 (인덱스) 또는 힙 데이터 페이지를 보호하는 잠금입니다.

왜 여전히 S 잠금을 얻습니까?

이것은 힙에서 발생합니다. 예

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

산출 READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

산출 READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Paul Randal을 참조 하는 이 기사 에 따르면 이 BULK_OPERATION공유 HOBT 잠금 을 사용하는 이유 는 형식화되지 않은 페이지를 읽지 않기위한 것입니다.


5

ReadUncommitted 격리 수준은 잠금을 획득합니다. 스키마 안정성 잠금은 쿼리가 실행되는 동안 쿼리중인 개체가 변경되는 것을 방지합니다. 이 잠금은 스냅 샷 및 RCSI (read_committed_snapshot)를 포함한 모든 격리 수준에서 획득됩니다. 에서 잠금 모드 :

스키마 잠금

데이터베이스 엔진은 열 추가 또는 테이블 삭제와 같은 테이블 데이터 정의 언어 (DDL) 작업 중에 스키마 수정 (Sch-M) 잠금을 사용합니다. 유지되는 동안 Sch-M 잠금은 테이블에 대한 동시 액세스를 방지합니다. 이는 Sch-M 잠금이 잠금이 해제 될 때까지 모든 외부 작업을 차단 함을 의미합니다.

테이블 잘림과 같은 일부 DML (데이터 조작 언어) 작업은 Sch-M 잠금을 사용하여 동시 작업으로 영향을받는 테이블에 액세스하지 못하게합니다.

데이터베이스 엔진은 쿼리를 컴파일하고 실행할 때 스키마 안정성 (Sch-S) 잠금을 사용합니다. Sch-S 잠금은 배타적 (X) 잠금을 포함하여 모든 트랜잭션 잠금을 차단하지 않습니다. 따라서 테이블에 X 잠금이있는 트랜잭션을 포함한 다른 트랜잭션은 쿼리가 컴파일되는 동안 계속 실행됩니다. 그러나 동시 DDL 작업과 Sch-M 잠금을 획득하는 동시 DML 작업은 테이블에서 수행 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.