락 에스컬레이션

SQL Server 2007. 2. 27. 16:34
[잠금 수준 조정]
SQL Server
는 필요할 때 행 잠금이나 키 잠금이나 페이지 잠금을 자동으로 테이블 잠금으로 바꾼다. 이 잠금 수준 조정은 시스템 리소스를 보호하고(, 시스템이 잠금을 유지하기 위해 너무 많은 메모리를 사용하지 않도록 방지해주고), 효율성을 증대시킨다. 예를 들면, 쿼리가 많은 행 잠금을 얻은 후 잠금 수준은 테이블 잠금으로 바뀔 수 있다. 테이블에 있는 모든 행들이 방문되어야 한다면 아마도 많은 행 잠금들을 얻는 것보다 한 개의 테이블 잠금을 얻는 것이 더 나을 것이다. 한 개의 테이블 잠금이 얻어지고 많은 행 잠금들이 해제된다. 테이블 잠금으로 바뀌면 잠금 오버헤드가 줄어들고 시스템에서 잠금 부족 현상일 일어나지 않게 예방된다. 잠금 구조에 사용할 수 있는 메모리의 양이 유한이기 때문에 이따금 잠금에 사용되는 메모리가 일정한 한계 내에 머무르도록 하기 위해 잠금 수준 조정이 필요한다.
한 트랜잭션에 대한 잠금 카운트가 1250을 초과할 때 또는 한 인덱스나 테이블 스캔에 대한 잠금 카운트가 765를 초과할 때, 잠금 관리자는 시스템의 모든 잠금들을 위해 얼마나 많은 메모리가 사용되고 있는지 알아본다. 메모리 풀의 40%이상이 잠금을 위해 사용되고 있다면 SQL Server가 여러 개의 페이지 잠금이나 키 잠금이나 RID 잠금을 테이블 잠금으로 바꾸려고 시도한다. SQL Server는 트랜잭션에 의해 부분적으로 잠기고 가장 많은 잠금 수를 유지하고 있는 테이블을 찾으려고 한다. 다른 프로세스가 동일한 테이블에 있는 다른 RID나 키나 페이지에서 호환되지 않은 잠금을 유지하고 있다면 여러 RID 잠금이나 키 잠금이나 페이지 잠금들은 테이블 잠금으로 바뀔 수 없다 가능한 모든 잠금 수준 조정이 이루어지거나 잠금에 사용된 전체 메모리가 40%이하로 떨어질 때까지 SQL Server는 동일한 트랜잭션에 의해 부분적으로 잠긴 다른 테이블들을 계속해서 찾을 것이다. SQL Server는 결코 페이지 잠금으로 바꾸지 않는다는 것에 주목하기 바란다. 잠금 수준 조정의 결과는 항상 테이블 잠금이다.
AND