programing

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

muds 2023. 10. 18. 23:06
반응형

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

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

ROWLOCK 힌트를 사용할 수 있지만 리소스가 부족할 경우 AFAIK SQL에서 이 힌트를 확대하기로 결정할 수 있습니다.

문서에서:

ROWLOCK 일반적으로 페이지 또는 테이블 잠금이 설정될 때 행 잠금이 설정되도록 지정합니다.스냅샷 분리 수준에서 작동하는 트랜잭션에 지정된 경우 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의 ALLW_PAGE_LOCK 절을 사용합니다.

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

반응형