programing

SQL Server에서 행 수준 잠금을 강제 할 수 있습니까?

sourcetip 2021. 1. 15. 20:24
반응형

SQL Server에서 행 수준 잠금을 강제 할 수 있습니까?


SQL Server에서 행 수준 및 페이지 수준 잠금을 해제하는 방법을 볼 수 있지만 SQL Server에서 행 수준 잠금을 사용하도록 강제하는 방법을 찾을 수 없습니다. SQL Server가 행 수준 잠금을 사용하고 페이지 수준 잠금을 사용하지 않도록 강제하는 방법이 있습니까?


ROWLOCK 힌트를 사용할 수 있지만 AFAIK SQL은 리소스가 부족하면 에스컬레이션하기로 결정할 수 있습니다.

doco에서 :

ROWLOCK 페이지 또는 테이블 잠금이 일반적으로 수행 될 때 행 잠금이 수행되도록 지정합니다. SNAPSHOT 격리 수준에서 작동하는 트랜잭션에 지정된 경우 ROWLOCK이 잠금이 필요한 다른 테이블 힌트 (예 : UPDLOCK 및 HOLDLOCK)와 결합되지 않는 한 행 잠금이 수행되지 않습니다.

행 수준 잠금을 획득하는 잠금 힌트 ROWLOCK, UPDLOCK 및 XLOCK은 실제 데이터 행이 아닌 인덱스 키에 잠금을 설정할 수 있습니다. 예를 들어 테이블에 비 클러스터형 인덱스가 있고 잠금 힌트를 사용하는 SELECT 문이 커버링 인덱스에 의해 처리되는 경우 기본 테이블의 데이터 행이 아닌 커버링 인덱스의 인덱스 키에서 잠금이 획득됩니다.

마지막으로 이것은 SQL Server 2008에서 변경된 SQL Server 2005의 잠금 에스컬레이션에 대한 매우 심층적 인 설명을 제공합니다.

또한 매우 심층적 인 내용이 있습니다. 데이터베이스 엔진의 잠금 (온라인 설명서)

그래서 일반적으로

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

정상이어야하지만 인덱스 및 서버의로드에 따라 페이지 잠금으로 확대 될 수 있습니다.


ALTER / CREATE INDEX 의 ALLOW_PAGE_LOCKS 절을 사용하십시오 .

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);

옵티마이 저가 어떤 작업을 수행하도록 강제 할 수는 없지만 안내 할 수 있습니다.

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

참조- 잠금 및 힌트를 사용하여 SQL Server 제어

참조 URL : https://stackoverflow.com/questions/3114826/is-it-possible-to-force-row-level-locking-in-sql-server

반응형