차단이란 무엇이며 어떻게 발생합니까?


20

SQL Server에서 차단에 대한 정보를 찾으려고했지만 그것이 무엇인지, 어떻게 발생하는지에 대한 간결한 설명을 찾을 수 없었습니다. 제발 나를 밝힐 수 있습니까?

답변:


23

유추

때로는 컴퓨터에서 멀리 유추를 사용하는 데 도움이됩니다.

공 하나와 두 자녀가 있다고 가정 해 봅시다. 한 번에 한 명의 어린이 만 공을 가질 수 있습니다. 그러나 어린이 중 한 명이 공을 가져 와서 산만 해져 놓아 두지 않으면 (예 : TV 시청), 다른 어린이는 공을 가지고 놀 수 없습니다.

다른 자식은 해당 리소스에서 차단됩니다.

예를 들어 이것을 TV와 비교하면 여러 어린이가 어느 시점에서나 TV를 볼 수 있습니다.

자물쇠

데이터베이스 세계로 넘어 가면 위의 두 예제와 같이 리소스를 사용하는 다른 방법이 있음을 알 수 있습니다. "읽기"를 수행하거나 "쓰기"를 수행 할 수 있습니다.

데이터를 읽고 싶을 때 두 사람이 TV를 보는 것처럼 다른 사람도 데이터를 읽을 수없는 이유는 없습니다. 그러나 데이터를 쓰려면 다른 사람이 데이터를 보지 않도록해야합니다. 우리가 쓰고있는 동안 그들이 읽는다면, 그들은 "더러운"읽습니다. 즉, 데이터가 부분적으로 작성된 것을 볼 수 있으며 이는 유효하지 않습니다.

이러한 더티 읽기가 발생하지 않도록하기 위해 읽기 잠금과 배타적 잠금이라는 두 가지 기본 잠금 유형이 있습니다.

읽기 잠금

주어진 시간에 동일한 데이터 소스에서 여러 개의 서로 다른 연결을 읽을 수 있습니다. 그러나 데이터를 읽는 동안 아무도 데이터를 변경하지 않도록하기 위해 읽기 잠금을 해제합니다.

연결에 데이터에 대한 읽기 잠금이 있으면 다른 모든 연결은 데이터를 쓰기 전에 읽기 잠금이 해제 될 때까지 기다려야 합니다. 그러나 다른 사람들은 동일한 데이터 조각에서 자체 읽기 잠금을 수행 할 수 있습니다.

독점 잠금

연결에서 데이터를 업데이트 / 삽입 / 삭제하려면 독점 잠금을 해제해야합니다. 이렇게하면 다른 연결이 데이터를 잠그지 못하게됩니다 (잠금을 해당 연결에만 적용).

연결에 데이터에 대한 독점 잠금이있는 경우 데이터에서 다른 연결을 읽을 수 없습니다. 이렇게하면 데이터를 쓰는 동안 아무도 데이터를 읽을 수 없도록하여 더티 읽기를 방지 할 수 있습니다.

블로킹

"차단"은 단순히 다른 연결이 읽기 또는 쓰기를 원할 때 한 연결이 리소스에 대한 잠금을 보유하고 있음을 의미하는 용어입니다. 반드시 소유자 연결이 연결을 해제하지 않고 현재 연결을 유지하고 있다는 의미는 아닙니다.

공을 들고있는 아이의 경우와 비교해보십시오. 공을 들고있는 어린이가 다른 모든 어린이가 공을 들고있는 것을 막고 있습니다.

이중 자물쇠

나는 당신이 이것을 묻지 않았다는 것을 알고 있지만 교착 상태에 빠지는 단계는 하나뿐입니다 (그리고 그것은 블로킹과 매우 직접 관련이 있습니다).

교착 상태는 각각 잠금이있는 두 개의 연결이 있지만 서로의 리소스를 원할 때 발생할 수 있습니다. 이 시나리오에서는 각각 공을 가지고 있지만 다른 공을 원하는 것은 두 자녀와 같습니다.

어린이와 마찬가지로 이러한 연결은 기꺼이 공유하지 않습니다. 계속하려면 각 연결에 두 자원 모두에 액세스해야합니다. 그러나 영구 차단 상태에 있습니다. 이 상태에서 상위 (DBMS)가 들어 와서 패자를 선택해야 하위 (연결) 중 하나가 두 자원 모두에 액세스 할 수 있습니다.

해당 "승인"연결이 완료되면 리소스가 해제되고 다른 연결 ( "손실") 연결이 다시 시도되어 두 리소스를 모두 얻을 수 있습니다.

교착 상태의 개념은 서로를 차단하는 두 개의 자원이있는 곳입니다.


여기 에서는 SQL Server가 제공하는 모든 종류의 잠금 및 차단 / 교착 상태를 유발할 수있는 다양한 리소스에 대해 자세히 알아볼 수 있습니다. 이 기사는 오래되었지만 SQL Server 2000에서 2008 R2까지 계속 적용됩니다. 이후 버전의 SQL Server에는 몇 가지 유형의 잠금이 추가되었지만 시작점을 제공합니다.


1
@Richard, 교착 상태가 발생하면 언급했듯이 DBMS가 들어 와서 패자를 선택합니다. DBMS가 자동으로 수행합니까? 아니면 제대로 설계되지 않은 시스템 (교착 상태가 자주 발생하는 시스템)은 사람이 DBMS를 시작하기 전까지 중단됩니까?
CenterOrbit

2
SQL Server의 경우이 작업은 자동으로 수행됩니다 (데이터베이스 가 교착 상태를 감지 할 수있는 경우 ). 예를 들어 실제로 잠금 인 경우이를 감지하는 데 문제가있을 수 있습니다 .
Richard

훌륭하고 철저한 대답 Richard. 라이브 잠금에 대한 하나의 추가 포인트 (실제로 오래된 오래된 차단 인 교착 상태와 실제로 비교되거나 관련되어서는 안 됨) ... SQL은 독점적 잠금이 대기중인 경우 추가 잠금이 발생하지 않도록합니다 .IIRC는 4 개의 연속적인 겹치는 공유 잠금입니다.
Mark Storey-Smith

5

Richard의 훌륭한 설명이지만 공식 문서에 대한 링크를 추가하고 싶었습니다. 이 주제는 SQL Server 2000 용으로 작성되었지만 오늘날에도 많은 개념이 동일하게 유지됩니다.

차단 이해 및 피하기

SQL Server의 잠금 이해

편집-일부 추가 사항 :

3 명 모두 SQL Server 작성자 및 / 또는 MVP로 잘 알려져 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.