다음을 통해 공유


데이터베이스 엔진에서의 잠금

잠금은 MicrosoftSQL Server 데이터베이스 엔진에서 사용하는 메커니즘으로 동시에 여러 사용자가 동일한 데이터에 액세스하는 것을 동기화합니다.

특정 트랜잭션이 데이터 읽기나 수정 등을 통해 현재 데이터 상태에 종속되기 전에 동일한 데이터를 수정하는 다른 트랜잭션의 영향을 받지 못하도록 해당 트랜잭션을 보호해야 합니다. 트랜잭션은 데이터에 대한 잠금을 요청하여 자체 트랜잭션을 보호합니다. 잠금에는 공유나 배타 등의 다양한 모드가 있습니다. 잠금 모드는 데이터에 대한 트랜잭션의 종속성 수준을 정의합니다. 해당 데이터에 대해 이미 다른 트랜잭션에 허용된 잠금 모드와 충돌되는 잠금은 이 트랜잭션에 허용될 수 없습니다. 특정 트랜잭션에서 이미 허용된 잠금과 충돌되는 잠금 모드를 동일한 데이터에 요청하면 데이터베이스 엔진 인스턴스는 첫 번째 잠금이 해제될 때까지 요청한 트랜잭션을 일시 중지합니다.

트랜잭션을 통해 데이터를 수정하는 경우 해당 트랜잭션이 끝날 때까지 잠금을 지속하여 수정한 내용이 유지되도록 보호합니다. 읽기 작업을 보호할 수 있도록 획득한 잠금을 트랜잭션에서 지속하는 기간은 트랜잭션 격리 수준 설정에 따라 다릅니다. 트랜잭션을 통해 지속되는 모든 잠금은 트랜잭션이 완료되어 커밋되거나 롤백될 때 해제됩니다.

일반적으로 응용 프로그램은 잠금을 직접 요청하지 않습니다. 잠금은 잠금 관리자라고 하는 데이터베이스 엔진의 일부를 통해 내부적으로 관리됩니다. 데이터베이스 엔진 인스턴스가 Transact-SQL 문을 처리할 때 데이터베이스 엔진 쿼리 프로세서는 액세스할 리소스를 확인합니다. 쿼리 프로세서는 액세스 유형과 트랜잭션 격리 수준 설정에 따라 각 리소스를 보호하는 데 필요한 잠금 유형을 결정합니다. 그런 다음 쿼리 프로세서는 잠금 관리자에게 적절한 잠금을 요청합니다. 잠금 관리자는 다른 트랜잭션에서 지속되는 잠금과 충돌되지 않는 잠금을 허용합니다.

다음 표에는 중요한 잠금 개념에 대해 설명하는 항목이 나열되어 있습니다.

항목

설명

잠금 세분성 및 계층

잠금은 행, 페이지, 인덱스, 테이블 또는 데이터베이스와 같은 다양한 유형의 리소스에 요청할 수 있습니다. 일부 작업의 경우 여러 수준으로 세분하여 잠금을 설정하고 잠금 계층을 구성해야 합니다.

잠금 모드

잠금에는 잠긴 리소스에 적용되는 다른 트랜잭션의 액세스 수준을 지정하는 다양한 모드가 있습니다.

잠금 호환성(데이터베이스 엔진)

여러 트랜잭션은 해당 잠금 모드가 호환되는 경우 동일한 리소스에 대한 동시 잠금을 획득할 수 있습니다. 기존 잠금과 충돌하는 잠금 모드를 요청하는 트랜잭션은 첫 번째 잠금이 해제될 때까지 일시 중지됩니다.

키 범위 잠금

키 범위를 잠그면 직렬화 가능한 격리 수준에서 트랜잭션이 실행되어 가상 삽입 및 삭제를 방지할 수 있습니다.

잠금 에스컬레이션(데이터베이스 엔진)

트랜잭션이 다수의 행이나 페이지 잠금을 확보하면 데이터베이스 엔진은 테이블 잠금을 허용하고 잠금 오버헤드를 최소화하도록 낮은 수준의 모든 잠금을 해제합니다.

동적 잠금

데이터베이스 엔진은 Transact-SQL 문이 참조하는 최적화 프로그램의 예상 행 수에 따라 잠금 세분성 수준을 동적으로 선택할 수 있습니다.

잠금 정보 표시(데이터베이스 엔진)

데이터베이스 엔진 및 관련 API는 인스턴스나 데이터베이스에서 현재 지속되는 잠금에 대한 정보를 표시할 수 있는 다양한 메커니즘을 제공합니다.

교착 상태

교착 상태는 다른 작업에 필요한 리소스에 대해 작업마다 잠금을 설정하여 두 태스크가 영구적으로 서로 차단될 때 발생합니다.