나는 인터뷰에서이 질문을 받았으며 아무런 대답이 없었다. 여기 누구든지 설명 할 수 있습니까?
나는 인터뷰에서이 질문을 받았으며 아무런 대답이 없었다. 여기 누구든지 설명 할 수 있습니까?
답변:
DB 잠금은 행, 페이지 또는 전체 테이블 또는 인덱스에 존재할 수 있습니다. 트랜잭션이 진행 중일 때 트랜잭션이 보유한 잠금은 자원을 사용합니다. 잠금 에스컬레이션은 시스템이 여러 잠금을 상위 레벨 잠금으로 통합하는 경우 (예 : 여러 행 잠금을 페이지에 통합하거나 여러 페이지를 전체 테이블에 통합) 일반적으로 많은 수의 세분화 된 잠금이 차지하는 자원을 복구합니다.
특정 테이블의 잠금 에스컬레이션 정책을 제어하기 위해 테이블에 플래그를 설정 (온라인 서적의 ALTER TABLE 참조) 할 수 있지만 자동으로 수행됩니다. 특히, 이전 버전의 Sybase 및 SQL Server에서는 동일한 페이지에 동시에 별도의 행을 쓰는 두 개의 프로세스가있을 때 조기 또는 지나치게 열성적인 잠금 에스컬레이션이 문제가되었습니다. 충분히 멀리 돌아 가면 (IIRC SQL Server 6.5) SQL Server에는 실제로 행 잠금이 없었지만 테이블이나 페이지 만 잠글 수있었습니다. 이런 상황이 발생하면 같은 페이지에있는 레코드 삽입간에 경합이 발생할 수 있습니다. 종종 새 인덱스가 다른 페이지로 이동되도록 클러스터 된 인덱스를 테이블에 배치합니다.
SQL Server는 미세한 하위 수준 잠금을 여러 수준의 고급 수준 잠금으로 변환하여 메모리 오버 헤드 를 줄이기 위해 잠금 에스컬레이션 을 수행합니다 .
@ConcernedOfTunbridgeWells에 의해 위에서 언급 한 것과 같이 행 잠금이 페이지 잠금으로 에스컬레이션된다는 것은 신화입니다 .
행 업데이트가 거의없는 테이블 인 경우 SQL 엔진은 해당 행에서 행 잠금을 가져 오거나 해당 페이지에서 페이지 잠금을 시도합니다. Row-Lock을 사용했다고 가정 해 봅시다. 그러나 행 업데이트가 임계 값을 늘리면 (~ 5k 잠금) 여러 행 잠금을 사용하는 대신 단일 테이블 잠금이 필요합니다. 따라서 여러 행 잠금을 해제하고 단일 테이블 잠금을 사용하여 메모리 오버 헤드를 줄이지 만 동시성은 증가합니다. 페이지 잠금에서도 마찬가지입니다.
잠금 에스컬레이션 임계 값 잠금 에스컬레이션에 대한 자세한 설명은 MSDN 제가 그걸 어떻게 여기에 언급 된 AT-적어도 5000 잠금, 그리고 여러 가지 요인에 따라 달라집니다 https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx