SQL Server는 테이블을 선택할 때 잠금 순서를 어떻게 결정합니까?


10

시스템이로드 될 때 교착 상태 인 두 개의 저장 프로 시저가 있습니다. Proc B가 같은 테이블에 삽입되는 동안 Proc A는 테이블에서 선택됩니다. 잠금 그래프는 Proc A에 Proc B가 IX 모드 잠금을 원하는 S 모드 페이지 잠금을 가지고 있지만 Proc A는 Proc B가 이미 IX 모드 페이지 잠금이있는 다른 페이지에 대해 S 모드 페이지 잠금을 기다리고 있음을 보여줍니다. .

분명히 두 쿼리 모두 테이블의 페이지를 동일한 순서로 잠그는 방식으로 정렬 할 수는 있지만 그렇게하는 방법을 알 수는 없습니다.

내 질문은 : SQL Server는 INSERT 및 SELECT를 수행하는 동안 페이지를 잠글 순서를 어떻게 결정 하며이 동작을 어떻게 수정할 수 있습니까?

답변:


2

SQL Server는 INSERT 및 SELECT를 수행하는 동안 페이지를 잠글 순서를 어떻게 결정합니까?

미결정-내부 처리 및 쿼리 최적화 프로그램 출력에 따라 수행됩니다.

이 행동을 어떻게 수정할 수 있습니까?

격리를 통제하십시오. 쓰기 위해 읽으면 SQL Server에 즉시 쓰기 잠금을 받도록 지시하십시오. 포인트가 마감되었습니다.


1

현재 proc A에는 공유 잠금이 있습니다.

"자원에 공유 잠금 (S) 잠금이 존재하는 동안 다른 트랜잭션은 데이터를 수정할 수 없습니다." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

SQL 2005 이상인 경우 스냅 샷 격리를 사용해보십시오.

"스냅 샷 격리 수준은 행 버전 관리를 사용하여 트랜잭션 수준 읽기 일관성을 제공합니다. 읽기 작업은 페이지 또는 행 잠금을 얻지 않고 SCH-S 테이블 잠금 만 얻습니다. 다른 트랜잭션으로 수정 된 행을 읽을 때 행 버전을 검색합니다. ALLOW_SNAPSHOT_ISOLATION 데이터베이스 옵션이 ON으로 설정된 경우 데이터베이스에 대해서만 스냅 샷 격리를 사용할 수 있습니다. 기본적으로이 옵션은 사용자 데이터베이스에 대해 OFF로 설정되어 있습니다. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Sch-S 잠금 만 획득되므로 '읽기가 읽기를 차단할 수 없습니다.

"스키마 안정성 (Sch-S) 잠금은 배타적 (X) 잠금을 포함한 트랜잭션 잠금을 차단하지 않습니다." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Snapshot Isolation Level은 행 버전 관리에 tempdb를 많이 사용하므로 적절하게 크기를 조정하고 tempdb 디스크 전략에 대한 모범 사례를 고수하십시오.

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