2012-08-29 1 views
12

아니라, 주제는 위키 피 디아에서 절연이 같은 단어가 소개 링크이 가장 높은 격리 수준이다 here 범위 잠금이란 무엇입니까?

......... 직렬화 입니다. 잠금 기반 동시성 제어 DBMS 구현에서 직렬화 기능을 사용하려면 트랜잭션이 끝날 때 선택된 데이터에서 획득 한 읽기 및 쓰기 잠금이 해제되어야합니다. 또한 범위 잠금은 SELECT 쿼리가 원거리 WHERE 절을 사용할 때, 특히 팬텀 읽기 현상 (아래 참조)을 피하기 위해 획득해야합니다. 비 잠금 기반 동시성 제어를 사용할 때 잠금이 획득되지 않습니다. 그러나 시스템이 여러 동시 트랜잭션 중 쓰기 충돌을 감지하면 그 중 하나만 커밋 할 수 있습니다. 이 주제에 대한 자세한 내용은 스냅 샷 격리를 참조하십시오.

하지만 전체 주제가 "범위 잠금"을 설명하지 못했습니다. Google은 정확한 설명이 없습니다.

"범위 잠금"은 무엇이며 "읽기 잠금"과 "쓰기 잠금"은 무엇이 다른가요?

감사합니다.

답변

8

WHERE 절에 범위를 사용하면 데이터베이스는이 범위의 가능한 모든 튜플과 다음 튜플 (전후)을 잠급니다. 한 방향으로 사용할 수있는 다음 튜플이 없으면이 방향으로 완전히 잠 깁니다.

따라서 SELECT은 트랜잭션 내에서 안정적입니다.

+2

이것은 단지 'BETWEEN'을위한 것이 아닙니다. 단일 행에 대한 선택이 아닌 경우 언제든지 범위 잠금을 얻을 수 있습니다. 'SELECT * FROM LastName = 'Adams'는 하나 이상의 행을 반환 할 수 있고 BETWEEN 절이 없기 때문에 범위입니다. –

+1

범위 잠금은 튜플 자체가 아닌 두 튜플 사이의 범위를 잠급니다. – usr

+0

이 컨텍스트에서 "튜플"이란 무엇입니까? – d512

9

동시 작업 충돌을 방지하기 위해 잠금을 사용하는 가장 쉬운 방법은 (모든 데이터베이스가 잠금을 사용하지 않고) 전체 데이터베이스를 잠그는 것입니다. 이것은 모든 것을 하나씩 하나 만들 것이고, 그것은 아주 느릴 것입니다.

다음은 전체 테이블을 잠그는 경우입니다. 적어도 다른 테이블은 느려지지 않습니다.

가장 좁은 행을 잠그는 것입니다. 해당 행을 안전하게 업데이트하고 다른 작업을 차단할 수는 없습니다.

범위 잠금은 마지막 두 사이 사이에 있습니다. 사용되는 경우는 다음과 같습니다.

  1. 값의 범위는 쿼리의 영향을받습니다.
  2. 고유하지 않은 색인은 검색어에 의해 영향을받습니다 (예 : 23과 일치하는 행이 여러 개있을 수 있으므로 23은 행이 아닌 범위를 식별합니다).
  3. 새 자동 증가 키 삽입 (범위 : max(curvalue) + indexincrement 사이에서 잠그십시오).