1

나는 범위 잠금을 사용하는 읽기가 &이라는 사실을 알고 있습니다. 쓰기 잠금은 트랜잭션 기간 동안 직렬화 가능 격리 수준에서 유지됩니다. 나는 '모든 것이 평등하고, 직렬 가능 격리가 다른 격리 수준보다 낮은 동시성을 초래할 수 있습니다.'라고 말하는 사람을 이해할 수 있습니다. 그러나 모든 블로그/문서에 명시된 바와 같이 낮은 동시성과 높은 교착 상태가 확실한 것으로 보입니다. 나는 왜 그것이 나의 특별한 경우에 실제적인 의미에서 그렇게되어야하는지 이해하려고 노력하고있다. 여기에 다양한 연결이 동일 레코드에 접근하지 않으면 내가Serializable 격리 수준으로 인해 교착 상태 및 동시성 문제가 발생하는 이유는 무엇입니까?

  1. 은 직렬화 격리 수준이 낮은 동시성을 일으킬해야이 질문은? 나는 모든 쿼리가 단지 몇 개의 행을 반환하는 '포인트 쿼리'이고 최적화 프로그램이 훌륭한 계획을 수립하는 '미세 조정 된'OLTP 시스템을 가정합니다. 나는 또한 인덱스 페이지가 아닌 데이터 페이지의 관점에서 생각하고있다.

  2. 교착 상태가 증가하는 이유는 무엇입니까? 인덱스 페이지가 업데이트 되었기 때문입니까? 그러나 이러한 문제는 스냅 샷 격리 이외의 다른 격리 수준에서 발생할 수 있습니다. 그렇다면 Serializable Isolation 레벨을 왜 단일성으로 만들었습니까?

물론 '사용자 입력을 기반으로 실행 계획이 잘못 될 때를 절대 알지 못합니다. 필요한 격리 수준보다 높게 설정하여 나쁜 상황을 악화시키고 있습니다. 그래서 당신을 위해 가장 잘 작동하는 가장 높은 격리 수준을 설정하십시오. '

답변

1

까지 read uncommitted까지가는 길고 다양한 종류의 잠금 장치가 필요합니다. 그리고 어느 정도 수준에서는 의미가 있습니다. 어떻게 데이터베이스 엔진이 다음과 같은 보증을 할 수 있습니까?

다른 트랜잭션은 현재 트랜잭션이 완료 될 때까지 현재 트랜잭션의 모든 명령문이 읽는 키 범위에 속하는 키 값을 가진 새 행을 삽입 할 수 없습니다.

자세한 내용은 설명서에서 곧바로 범위 잠금이 제거되었다고 말합니다.

  • 이 ID를 11-50에 대한 모든 데이터를 삽입 : 당신이 select * from dbo.yourTable where ID between 1 and 50 그런 짓을, 그리고 10 행이 테이블에 현재있는 경우에 따라서, 응용 프로그램이 할 수 없습니다 (ID가 1-10 말)
  • 삭제/

당신이 그것을 필요로하는 경우에 1-10의 업데이트, 당신은 그것을 필요합니다. 그러나 당신이 뭘하고 있는지 알아. 배치되는 공유 된 범위 잠금은 많은 것들을 가지고 호환되지 않습니다 ("블로킹을 유발합니다"라고 읽음). 자세한 내용은 the Lock Compatibility Matrix을 참조하십시오.

+0

연결에 범위 잠금이 걸리면 분명히 동의 할 것입니다. 하지만 정확히 동일한 레코드/페이지에 액세스하는 데 2 ​​개의 다른 사용자 연결이 드문 경우 여전히 답변을 보유하고 있습니까? – QFirstLast

+0

범위 잠금을 사용하면 메타 구조를 잠글 수 있습니다. 즉, 데이터를 수정하려고 시도하는 작업에 대해 데이터가 존재할 필요가 없습니다 (위의 글 머리표 참조). 따라서 두 개 (또는 그 이상)의 응용 프로그램이 분리 된 범위를 수정한다는 것을 알고 있다면 좋은 것입니다. 하지만 나는 그 점에서 직렬화 가능 격리가 필요한 이유는 무엇입니까? –

+0

감사합니다. "왜 그 시점에서 직렬화 가능 격리가 필요하겠습니까?"에 대해서는 아직 결정을 내리지 못했습니다.우리는 각 고립 수준의 특성, 장단점을 이해하고 우리 상황에 적용하는 과정에 있습니다. 귀하의 응답이 도움이되었습니다. 귀하의 답변을 답변으로 표시하려고 시도합니다. 내가 시도한 마지막 시간에 사이트에서 "그렇게 할 수 있기 전에 몇 x 포인트가 필요했다"고 말하지 않았습니다. – QFirstLast