문제

평범한 영어로 사용의 단점과 장점은 무엇입니까?

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

.NET 애플리케이션 및보고 서비스 애플리케이션에 대한 쿼리에서?

도움이 되었습니까?

해결책

이 격리 수준은 더러운 읽기를 허용합니다. 하나의 거래는 다른 거래에서 커밋되지 않은 변경 사항을 볼 수 있습니다.

최고 수준의 격리를 유지하기 위해 DBMS는 일반적으로 데이터의 잠금 장치를 획득하여 동시성 손실과 높은 잠금 오버 헤드를 초래할 수 있습니다. 이 격리 수준은이 속성을 이완시킵니다.

당신은 그것을 확인하고 싶을 수도 있습니다 위키 백과 기사 READ UNCOMMITTED 몇 가지 예와 추가 독서를 위해.


Jeff Atwood의 체크 아웃에 관심이있을 수도 있습니다. 블로그 기사 그와 그의 팀이 스택 오버플로 초기에 교착 상태 문제를 해결하는 방법에 대해. Jeff에 따르면 :

하지만 nolock 위험한? 유효하지 않은 데이터를 읽을 수 있습니까? read uncommitted 에? 예, 이론적으로. 당신은 당신에게 산 과학을 떨어 뜨리기 시작하는 데이터베이스 아키텍처 우주 비행사가 부족하지 않을 것입니다. nolock. 사실입니다 : 이론은 무섭습니다. 그러나 여기에 내가 생각하는 것은 다음과 같습니다. "이론적으로는 이론과 실천 사이에는 차이가 없습니다. 실제로는 있습니다."

나는 결코 사용하지 않을 것입니다 nolock일반적인 "당신이 무엇을 위해, 당신이 무엇을하는지에 좋은"뱀 오일 수정은 당신이 가질 수있는 모든 데이터베이스 교착 문제에 대해 뱀 오일 수정입니다. 먼저 문제의 출처를 진단하려고 노력해야합니다.

그러나 실제로 추가 nolock 당신이 절대적으로 알고있는 질문은 간단하고 간단한 읽기 전용 업무는 결코 문제로 이어지지 않는 것 같습니다 ... 당신이 무엇을하고 있는지 아는 한.

하나의 대안 READ UNCOMMITTED 당신이 고려하고 싶은 수준은입니다 READ COMMITTED SNAPSHOT. 다시 Jeff 인용 :

스냅 샷은 완전히 새로운 데이터 변경 추적 방법에 의존합니다. 단지 약간의 논리적 변경 이상보다 서버가 데이터를 물리적으로 다르게 처리해야합니다. 이 새로운 데이터 변경 추적 방법이 활성화되면 모든 데이터 변경의 사본 또는 스냅 샷이 생성됩니다. 경합시 실시간 데이터 대신 이러한 스냅 샷을 읽으면 공유 잠금 장치가 더 이상 읽기에 필요하지 않으며 전체 데이터베이스 성능이 증가 할 수 있습니다.

다른 팁

이것은 긴 삽입 쿼리의 진행 상황을보고 대략적인 추정치를 작성하는 데 유용 할 수 있습니다 ( COUNT(*) 또는 거칠다 SUM(*)) 등.

다시 말해, 더러운 읽기 쿼리 리턴 결과는 추정치로 취급하고이를 기반으로 중요한 결정을 내리지 않는 한 괜찮습니다.

내가 가장 좋아하는 사용 사례 read uncommited 거래 내에서 일어나는 일을 디버깅하는 것입니다.

디버거에서 소프트웨어를 시작하십시오. 코드 라인을 밟는 동안 트랜잭션을 엽니 다. 데이터베이스를 수정합니다. 코드가 중지되는 동안 쿼리 분석기를 열 수 있습니다. 비활성화되지 않은 격리 수준을 읽으십시오 그리고 무슨 일이 일어나고 있는지 쿼리하십시오.

또한 긴 실행 절차가 데이터베이스를 올바르게 업데이트하는지 확인할 수도 있습니다.

회사가 지나치게 복잡한 저장 절차를 좋아한다면 좋습니다.

장점은 어떤 상황에서는 더 빠를 수 있다는 것입니다. 단점은 결과가 잘못 될 수 있다는 것입니다 (아직 커밋되지 않은 데이터는 아직 반환 될 수 있음) 결과를 반복 할 수 있다는 보장은 없습니다.

정확도에 관심이 있다면 이것을 사용하지 마십시오.

자세한 정보는 다음과 같습니다 MSDN:

더러운 읽기 또는 격리 레벨 0 잠금을 구현합니다. 즉, 공유 잠금 장치가 발행되지 않고 독점적 인 잠금 장치가 명예가 없습니다. 이 옵션이 설정되면 커밋되지 않은 또는 더러운 데이터를 읽을 수 있습니다. 트랜잭션이 끝나기 전에 데이터 세트에서 데이터의 값이 변경 될 수 있고 데이터 세트에서 행이 나타나거나 사라질 수 있습니다. 이 옵션은 트랜잭션의 모든 선택 문서에서 모든 테이블에서 Nolock을 설정하는 것과 동일한 효과를 갖습니다. 이것은 네 가지 격리 수준 중 가장 제한적인 것입니다.

사용해도 언제 괜찮습니까? READ UNCOMMITTED?

경험의 규칙

좋은: 끊임없이 변화하는 총계를 보여주는 큰 집계 보고서.

위험한: 거의 모든 것.

좋은 소식은 대부분의 읽기 전용 보고서가 좋은 범주.

자세한 세부 사항...

사용해도 :

  • 현재의 비 정적 데이터에 대한 거의 모든 사용자 대면 총 보고서, 즉 해당 연도는 현재까지 판매됩니다. 오류 마진 (<0.1%)이 발생할 위험이 있으며, 이는 오류를 입력하는 것과 같은 다른 불확실성 요소 또는 정확한 데이터가 분에서 분에서 분까지 기록 될 때의 무작위성과 같은 다른 불확실성 요소보다 훨씬 낮습니다.

이는 아마도 비즈니스 인텔리전스 부서가 SSR에서 할 일의 대부분을 다루고 있습니다. 물론 예외적으로, 그 앞에 $ 표시가있는 것은 무엇이든입니다. 많은 사람들이 고객에게 서비스를 제공하고 그 돈을 창출하는 데 필요한 관련 핵심 지표에 적용되는 것보다 훨씬 더 열심으로 돈을 차지합니다. (나는 회계사를 비난한다).

위험 할 때

  • 세부 수준으로 내려가는 모든 보고서. 해당 세부 사항이 필요한 경우 일반적으로 모든 행이 결정과 관련이 있음을 의미합니다. 실제로, 차단하지 않고 작은 서브 세트를 가져올 수 없다면 현재 편집중인 정당한 이유 일 수 있습니다.

  • 역사적 데이터. 실용적인 차이는 거의 없지만 사용자는 끊임없이 변화하는 데이터가 완벽 할 수는 없지만 정적 데이터에 대해서도 동일하게 느끼지 않습니다. Dirty Reads는 여기서 아프지 않지만 두 배의 읽기는 때때로있을 수 있습니다. 어쨌든 정적 데이터에 블록이 없어야한다고 생각하는 이유는 무엇입니까?

  • 쓰기 기능이있는 응용 프로그램을 제공하는 거의 모든 것.

OK 시나리오조차 괜찮을 때.

  • 응용 프로그램이나 업데이트 프로세스가 큰 단일 트랜잭션을 사용 하는가? 제거한 후에보고하는 많은 레코드를 다시 삽입합니까? 이 경우 실제로 사용할 수 없습니다 NOLOCK 무엇이든 그 테이블에.

보고와 관련하여, 우리는 모든보고 쿼리에 사용하여 쿼리가 데이터베이스를 낮추는 것을 방지합니다. 우리는 최신 데이터가 아닌 과거 데이터를 가져 오기 때문에 그렇게 할 수 있습니다.

이것은 당신에게 더러운 읽기를 줄 것이며, 아직 커밋되지 않은 거래를 보여줄 것입니다. 그것이 가장 분명한 대답입니다. 나는 당신의 독서 속도를 높이기 위해 이것을 사용하는 것이 좋은 생각이라고 생각하지 않습니다. 좋은 데이터베이스 디자인을 사용하는 경우 다른 방법이 있습니다.

무슨 일이 일어나지 않는지 주목하는 것도 흥미 롭습니다. 커밋되지 않은 읽기는 다른 테이블 잠금을 무시하지 않습니다. 또한 자체적으로 자물쇠를 유발하지 않습니다.

대규모 보고서를 생성하거나 크고 복잡한 선택 문을 사용하여 데이터베이스에서 데이터를 마이그레이션하는 것을 고려하십시오. 이로 인해 거래 기간 동안 공유 테이블 잠금으로 확대 될 수있는 공유 잠금 장치가 발생합니다. 다른 거래는 테이블에서 읽을 수 있지만 업데이트는 불가능합니다. 생산이 완전히 멈출 수 있기 때문에 생산 데이터베이스가 있다면 이것은 나쁜 생각 일 수 있습니다.

read upcommitted를 사용하는 경우 테이블에 공유 잠금 장치가 설정되지 않습니다. 일부 새로운 거래에서 결과를 얻을 수 있거나 데이터가 삽입 된 테이블 위치에 의존하지 않을 수도 있고 선택 트랜잭션이 얼마나 오래 읽었습니까? 예를 들어 페이지 분할이 발생하면 동일한 데이터를 두 번 얻을 수도 있습니다 (데이터가 데이터 파일의 다른 위치에 복사됩니다).

따라서 선택하는 동안 데이터를 삽입 할 수있는 것이 매우 중요하다면, 선택하지 않은 읽기는 의미가있을 수 있습니다. 보고서에 약간의 오류가 포함되어있을 수 있지만 수백만 행을 기준으로하고 결과를 선택하는 동안 그 중 일부만 업데이트되는 경우 "충분히"일 수 있습니다. 행의 독창성이 보장되지 않기 때문에 거래도 함께 실패 할 수 있습니다.

더 나은 방법은 스냅 샷 격리 수준을 사용하는 것이지만 응용 프로그램은이를 사용하기 위해 약간의 조정이 필요할 수 있습니다. 이에 대한 한 가지 예는 응용 프로그램이 다른 사람들이 읽지 못하게하고 UI에서 편집 모드로 들어가는 것을 방지하기 위해 행을 독점적으로 잠그는 경우입니다. 스냅 샷 격리 레벨에는 상당한 성능 페널티 (특히 디스크에서)가 제공됩니다. 그러나 문제에 대한 하드웨어를 던져서 극복 할 수 있습니다. :)

데이터를 데이터웨어 하우스에보고하거나로드하는 데 사용할 데이터베이스의 백업을 복원하는 것을 고려할 수도 있습니다.

소스가 변경 될 가능성이 거의없는 상황에서 read_uncommitted를 사용하십시오.

  • 역사적 데이터를 읽을 때. 예를 들어 이틀 전에 발생한 일부 배포 로그.
  • 메타 데이터를 다시 읽을 때. 예를 들어 메타 데이터 기반 응용 프로그램.

Fetch 작동 중에 Souce가 변경 될 수 있다는 것을 알면 read_uncommitt를 사용하지 마십시오.

예를 들어 기존 행에 대한 업데이트가없고 다른 테이블에는 FK가없는 인서트 전용 감사 테이블과 같은 간단한 테이블에 사용할 수 있습니다. 인서트는 간단한 삽입물이며 롤백 가능성이 거의 없거나 거의 없습니다.

나는 항상 읽지 않은 읽기를 항상 사용합니다. 최소한의 문제로 빠릅니다. 다른 격리를 사용할 때는 거의 항상 일부 차단 문제가 발생합니다.

자동 증분 필드를 사용하고 인서트에 조금 더주의를 기울인다면 벌금을 낮추면 문제를 차단하는 데 작별 인사를 할 수 있습니다.

읽기가 원치 않는 상태에서 오류를 만들 수 있지만 솔직히 말하면 인서트가 완전한 증거인지 확인하는 것은 매우 쉽습니다. SELECT의 결과를 사용하는 인서트/업데이트는 조심해야 할 것입니다. (여기에 저지른 읽기 사용 또는 더러운 읽기가 문제를 일으키지 않도록하십시오)

그러니 더러운 읽기 (특히 큰 보고서를 위해)로 이동하면 소프트웨어가 더 부드럽게 실행됩니다 ...

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