문제

누군가 사용의 의미를 설명 할 수 있습니까? with (nolock) 쿼리에서 언제 사용해야합니까?

예를 들어, 특정 테이블에 높은 거래율과 많은 데이터가있는 은행 응용 프로그램이있는 경우 어떤 유형의 쿼리가 괜찮을까요? 항상 사용해야하는 경우가 있습니까/사용하지 마십시오.

도움이 되었습니까?

해결책

(nolock)을 사용하면 거래 격리 수준으로 읽은 읽기를 사용하는 것과 같습니다. 따라서, 당신은 이후에 롤백 된 소수의 행을 읽을 위험이 있습니다. 따라서 다른 운영에 의해 읽기가 교착 상태에 빠지는 것을 방지 할 수 있지만 위험이 있습니다. 거래율이 높은 은행 응용 프로그램에서는 IMHO로 해결하려는 문제에 대한 올바른 솔루션이 아닐 것입니다.

다른 팁

문제는 더 나쁜 것입니다.

  • 교착 상태, 또는
  • 잘못된 가치?

재무 데이터베이스의 경우 교착 상태는 잘못된 가치보다 훨씬 나쁩니다. 나는 그것이 거꾸로 들리는 것을 알고 있지만 내 말을 들었다. DB 트랜잭션의 전통적인 예는 두 행을 업데이트하여 하나에서 빼고 다른 행에 추가하는 것입니다. 그것은 잘못입니다.

재무 데이터베이스에서는 비즈니스 거래를 사용합니다. 즉, 각 계정에 한 행을 추가하는 것을 의미합니다. 이러한 거래가 완료되고 행이 성공적으로 작성되는 것이 가장 중요합니다.

계정 잔액을 일시적으로 잘못 이해하는 것은 큰 문제가 아닙니다. 이것이 바로 하루 종일 조정이 그랬던 것입니다. 또한 계정에서 초과 인출은 데이터베이스의 커밋되지 않은 읽기로 인해 두 개의 ATM이 한 번에 사용되기 때문에 발생할 가능성이 훨씬 높습니다.

즉, SQL Server 2005는 대부분의 버그를 수정했습니다. NOLOCK 필요한. 따라서 SQL Server 2000 이하를 사용하지 않는 한 필요하지 않아야합니다.

추가 독서
로우 레벨 버전화

Nolock 힌트의 합법적 인 사용에 대한 교과서 예제는 높은 업데이트 OLTP 데이터베이스에 대한 보고서 샘플링입니다.

주제 예를 들기 위해. 대규모 미국 하이 스트리트 은행이 은행에서 도시 수준의 첫 징후를 찾고있는 시간별 보고서를 실행하려면, Nolock 쿼리는 도시당 현금 예금 및 현금 인출을 합산하는 거래 테이블을 스캔 할 수 있습니다. 이러한 보고서의 경우 롤백 업데이트 트랜잭션으로 인한 작은 비율의 오류는 보고서의 가치를 줄이지 않습니다.

불행히도 커밋되지 않은 데이터를 읽는 것이 아닙니다. 백그라운드에서는 페이지를 두 번 읽을 수 있습니다 (페이지 분할의 경우) 또는 페이지를 완전히 놓칠 수 있습니다. 따라서 결과가 크게 왜곡 될 수 있습니다.

체크 아웃 Itzik Ben-Gan의 기사. 여기에 발췌가 있습니다.

"Nolock 힌트 (또는 커밋되지 않은 것을 읽도록 세션의 격리 수준을 설정 함)를 사용하면 SQL Server에게 일관성을 기대하지 않는다고 말하면 보장이 없습니다."일관성이없는 데이터 "는 그 의미만을 의미합니다. 나중에 롤백 된 커밋되지 않은 변경 사항 또는 트랜잭션의 중간 상태에서 데이터 변경이 표시 될 수 있습니다. 또한 모든 테이블/인덱스 데이터를 스캔하는 간단한 쿼리에서 SQL Server가 스캔 위치를 잃을 수도 있거나 같은 행을 두 번 얻을 수 있음을 의미합니다.. "

데이터베이스 거래에서 금융 거래를 포기하지 않는 이유는 확실하지 않습니다 (한 계정에서 다른 계정으로 자금을 양도 할 때와 같이 - 한 번에 거래의 한쪽을 커밋하지 않습니다. 이것이 명시 적 거래가 존재하는 이유입니다). 코드가 비즈니스 트랜잭션에 비즈니스 거래에 대한 Braindead이더라도 모든 트랜잭션 데이터베이스는 오류 또는 고장시 암시 적 롤백을 수행 할 가능성이 있습니다. 이 토론은 당신의 머리 위로 있다고 생각합니다.

잠금 문제가있는 경우 버전 작성을 구현하고 코드를 정리하십시오.

잠금은 잘못된 값을 반환 할뿐만 아니라 팬텀 레코드를 반환하고 복제를 반환합니다.

항상 쿼리를 더 빨리 실행한다는 것이 일반적인 오해입니다. 테이블에 쓰기 잠금 장치가 없으면 아무런 차이가 없습니다. 테이블에 자물쇠가 있으면 쿼리가 더 빨라질 수 있지만 처음에는 잠금 장치가 발명 된 이유가 있습니다.

공정하게, 다음은 Nolock 힌트가 유틸리티를 제공 할 수있는 두 가지 특별한 시나리오입니다.

1) 2005 년 Pre-2005 SQL Server 데이터베이스 라이브 OLTP 데이터베이스에 대해 긴 쿼리를 실행 해야하는 유일한 방법 일 수 있습니다.

2) 레코드를 잠그고 UI에 대한 통제를 잠그고 반환하는 잘못된 서면 응용 프로그램은 무기한으로 차단됩니다. 응용 프로그램을 수정할 수없고 (타사 등) 데이터베이스가 2005 년 이전이거나 버전 설정을 켤 수없는 경우 Nolock은 여기에서 도움이 될 수 있습니다.

NOLOCK 동일합니다 READ UNCOMMITTED, 그러나 Microsoft는 사용해서는 안된다고 말합니다. UPDATE 또는 DELETE 진술 :

업데이트 또는 삭제 설명 :이 기능은 향후 버전의 Microsoft SQL Server에서 제거됩니다. 새로운 개발 작업 에서이 기능을 사용하지 말고 현재이 기능을 사용하는 응용 프로그램을 수정하십시오.

http://msdn.microsoft.com/en-us/library/ms187373.aspx

이 기사는 SQL Server 2005에 적용되므로 NOLOCK 해당 버전을 사용하는 경우 존재합니다. 향후 방지 CODE (Dirty Reads를 사용하기로 결정했다고 가정)를 위해 저장된 절차에서 사용할 수 있습니다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

데이터 만 읽을 때 사용할 수 있으며 아직 커밋되지 않은 데이터를 되 찾을 수 있는지 여부는 신경 쓰지 않습니다.

읽기 작업에서는 더 빠를 수 있지만 실제로 얼마나 말을 할 수는 없습니다.

일반적으로 사용하는 것이 좋습니다. 커밋되지 않은 데이터를 읽는 것이 약간 혼란 스러울 수 있습니다.

일반적으로 괜찮은 또 다른 사례는 데이터가 이미 노화되어 있고 쓰여지는보고 데이터베이스에 있습니다. 그러나이 경우 기본 격리 레벨을 변경하여 관리자가 데이터베이스 또는 테이블 레벨에서 옵션을 설정해야합니다.

일반적으로 : 당신은 당신이있을 때 사용할 수 있습니다. 매우 오래된 데이터를 읽는 것은 괜찮습니다. 기억해야 할 중요한 것은 그게 그것입니다 그 잘못을 쉽게 얻을 수 있습니다. 예를 들어, 쿼리를 작성할 때 괜찮더라도 앞으로 이러한 업데이트를 더 중요하게 만들기 위해 데이터베이스에서 무언가가 변경되지 않습니까?

나는 또한 아마도 그것이 아마도 그것이 아마도 두 번째로 생각할 것입니다 ~ 아니다 뱅킹 앱에서 좋은 아이디어. 또는 재고 앱. 또는 거래에 대해 생각하고있는 곳.

간단한 답변 - SQL이 데이터를 변경하지 않을 때마다, 잠금을 통해 다른 활동을 방해 할 수있는 쿼리가 있습니다.

보고서에 사용되는 쿼리, 특히 쿼리가 1 초 이상을 취하는 경우 고려할 가치가 있습니다.

OLAP 유형 보고서가 OLTP 데이터베이스에 대해 실행중인 경우 특히 유용합니다.

그러나 첫 번째 질문은 "왜 내가 이것에 대해 걱정 하는가?"입니다. 내 경험, 기본 잠금 동작이 종종 누군가 "무엇이든 시도한"모드에있을 때 종종 발생하는 경우가 종종 발생합니다. 이것은 예기치 않은 결과가 가능하지 않은 경우입니다. 너무 자주 그것은 조기 최적화의 사례이며 "만일을 대비하여"응용 프로그램에 너무 쉽게 내장 될 수 있습니다. 왜 그렇게하고 있는지, 어떤 문제가 해결되는지, 그리고 실제로 문제가 있는지 이해하는 것이 중요합니다.

내 2 센트 - 사용하는 것이 합리적입니다 WITH (NOLOCK) 보고서를 생성해야 할 때. 이 시점에서 데이터는 크게 변경되지 않으며 해당 레코드를 잠그고 싶지 않습니다.

금융 거래를 처리하는 경우 사용하고 싶지 않을 것입니다. nolock. nolock 많은 업데이트가있는 대형 테이블 중에서 선택하는 데 가장 적합하며 레코드가 구식이 될 수 있는지 상관하지 않습니다.

재무 기록 (및 대부분의 응용 프로그램의 거의 모든 다른 기록) nolock 서면으로 작성되고 올바른 데이터를 얻지 못한 레코드에서 데이터를 다시 읽을 수 있으므로 혼란을 흘리게됩니다.

나는 할 일을 위해 "다음 배치"를 검색하는 데 사용했습니다. 이 경우 정확한 항목은 중요하지 않으며 많은 사용자가 동일한 쿼리를 실행하고 있습니다.

짧은 대답:

사용하지 마십시오 WITH (NOLOCK).

긴 답변 :

Nolock은 종종 데이터베이스 읽기 속도를 높이기위한 마법의 방법으로 악용되지만 가능한 한 사용하지 않으려 고 노력합니다.

결과 세트에는 아직 커밋되지 않은 행이 포함될 수 있으며, 종종 나중에 롤백됩니다.

오류 또는 결과 세트가 비어 있거나, 행이 없거나 동일한 행을 여러 번 표시 할 수 있습니다.

다른 트랜잭션이 데이터를 읽는 동시에 데이터를 이동하기 때문입니다.

Committed 읽기 여러 사용자가 동일한 셀을 동시에 변경하는 단일 열 내에서 데이터가 손상되는 추가 문제가 추가됩니다.

다른 부작용도 있습니다. 이로 인해 처음부터 얻기를 희망하는 속도 증가를 희생합니다.

당신이 그것을 벗어날 수있는 곳에서 그것을 사용하는 것은 괜찮다고 주장 할 수 있지만, 요점은 무엇입니까? 손상된 데이터가 허용되는 상황을 생각할 수 없습니다.

절대 Nolock을 사용하지 마십시오.

(항상)

"더러운"데이터로 괜찮을 때는 Nolock을 사용하십시오. 즉, Nolock은 또한 수정 및/또는 헌신적 인 데이터를 수행하는 과정에서 데이터를 읽을 수 있습니다.

일반적으로 높은 트랜잭션 환경에서 사용하는 것이 좋지 않으므로 쿼리의 기본 옵션이 아닙니다.

(Nolock) 힌트와 함께 특히 활동이 높은 SQLSERVER 2000 데이터베이스에서 사용합니다. 그러나 SQL Server 2005에 필요한 것이 확실하지 않습니다. 나는 최근 고객의 DBA 요청에 따라 SQL Server 2000의 힌트를 덧붙였다.

내가 말할 수있는 것은 힌트를 사용하는 것이 우리를 해치지 않았고 잠금 문제가 스스로 해결 된 것으로 보인다는 것입니다. 해당 특정 클라이언트의 DBA는 기본적으로 우리가 힌트를 사용한다고 주장했습니다.

그건 그렇고, 내가 다루는 데이터베이스는 Enterprise Medical Claims 시스템의 백엔드이므로 많은 결합에서 수백만의 레코드와 20 개 이상의 테이블에 대해 이야기하고 있습니다. 나는 일반적으로 조인의 각 테이블에 대한 (nolock) 힌트를 추가합니다 (파생 테이블이 아니라면 특정 힌트를 사용할 수 없습니다).

가장 간단한 대답은 간단한 질문입니다. 결과를 반복하기 위해 결과가 필요합니까? 그렇다면 어떤 상황에서도 nolocks가 적합하지 않습니다.

반복성이 필요하지 않은 경우, 특히 대상 데이터베이스에 연결하는 모든 프로세스를 제어 할 수없는 경우 Nolocks가 유용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top