2012-07-10 3 views
0

내 클라이언트 세션 중 하나가 트랜잭션의 테이블에 항목을 만들고 처리를 계속합니다. 트랜잭션은 격리 모드 read committed에서 실행됩니다. 한편, 다른 클라이언트 세션은 테이블의 모든 데이터를보고합니다.readcommited IsolationMode로 잠긴 SQL Server 테이블에서 모든 행 선택

잠긴 행 (다른 클라이언트에 의해 삽입 됨)으로 인해 모든 선택 작업이 완전히 잠겨 있습니다.

완전히 잠기지 않고 전체를 선택하는 동안 커밋 된 데이터를 검색하는 방법은 무엇입니까?

도움을 주시면 감사하겠습니다.

+3

수 없습니다. 독자가 커밋 된 데이터를 얻기 위해'READ COMMITTED'를 사용한다면, 그것은 차단 될 것입니다. 'READ UNCOMMITTED'를 사용할 수 있습니다.하지만 커밋되지 않은 데이터도 얻을 수 있습니다. [READ COMMITTED SNAPSHOT ISOLATION 트랜잭션 수준] (http://msdn.microsoft.com/en-us/library/tcbchxcb%28vs.80%29.aspx)을 확인해야합니다. (스냅 샷을 사용하여) -하지만 [다른 단점이 있습니다] (http://www.jimmcleod.net/blog/index.php/2009/08/27/the-potential-dangers-of-the-read-committed -snapshot-isolation-level /) ('TempDB'에 대한 더 높은 압력) –

+0

'READPAST' 힌트를 볼 수 있습니다. –

답변

0

사용 시나리오는 구체적이지 않지만 테이블에서 데이터를 가져올 수 있습니다. 심각한 경고이 있습니다.

marc_s가 말했듯이 READ UNCOMMITTED 스냅 샷 격리 수준을 사용할 수 있으며 트랜잭션 내 모든 select 문에 WITH (NOLOCK)을 사용하는 것과 동일한 효과가 있습니다. 해당 테이블을 읽으려고하지만 트랜잭션의 다른 모든 읽기를 정상적으로 처리하려면 NOLOCK 힌트를 쿼리의 특정 테이블에 넣는 것이 좋습니다. 따라서, 예를 들어 : firstTable에 대한 일반적인 읽기 잠금을 실행하지만 잠금 장치 secondTable을 읽을 것

SELECT * 
    FROM firstTable f INNER JOIN 
     secondTable s WITH (NOLOCK) on f.Key = s.Key 

. 데이터를 효과적으로 손상시킬 수 있으므로 잠금 장치는 매우 위험 할 수 있습니다. 수행중인 삽입물이 데이터를 재정렬하고 페이지 분할을 일으키는 경우 동일한 행을 두 번 가져올 수 있으며 모든 종류의 비슷한 불쾌감을 느낄 수 있습니다.

따라서 가능하지만 이상하지는 않으며 에주의해야합니다. Some good further reading is here, courtesy of Jason Strate.

관련 문제