2014-11-27 5 views
4

T-SQL 문의 구문에 대한 문서를 찾을 수 없습니다. CTE 결과에서 WITH (ROWLOCK) UPDATE를 수행해야합니다.UPDATE + WITH (ROWLOCK) + CTE

뭔가 같은 : (. 그래서 top1000 table1.col2 될 것 업데이트 ** 표 행에 UPDATE시 (ROWLOCK) WITH 문이 ** 중요)

;WITH CTE AS 
    ( 
     SELECT TOP(1000) table1.col2 
     FROM table1 INNER JOIN table2 ON table1.id = table2.id  
    ) 
    UPDATE CTE WITH (ROWLOCK) 
    SET col2 = 1 

편집 위의 문 아마도 구문 상 정확하다. 그러나 누군가가 그러한 예를 발견하게된다면, 나를 링크로 알려주십시오.

그러나 내 전체 SQL은 아래처럼 보입니다. 실행 중에 오류가 발생합니다 : "충돌하는 힌트가 뷰"table1 "에 대해 충돌 잠금 힌트가 지정되었습니다." 선택시 WITH (NOLOCK)을, 업데이트시 WITH (ROWLOCK)을 사용할 수없는 이유는 무엇입니까?

;WITH CTE AS 
( 
    SELECT TOP(5) table1.col2 
    FROM table1 WITH (NOLOCK) INNER JOIN table2 WITH (NOLOCK) ON table1.id = table2.id 
    WHERE table1.col3 = 2 
    ORDER BY table1.id  
) 
UPDATE CTE WITH (ROWLOCK) 
SET col2 = 1 
+1

구문 적으로 유효한 명령문이지만 문제는 두 가지입니다. 명령문별로 순서가 없으므로 실제로 어떤 행을 업데이트할지 알지 못합니다. rowlock은 옵티 마이저에 대한 힌트 일 뿐이므로 사용할 수도 있고 사용하지 않을 수도 있습니다. 어쨌든 로크 록이 필요한 이유는 무엇입니까? –

+0

@PaulMcLoughlin 답변 해 주셔서 감사합니다. 나는 'sql 조합'과 함께 어떤 샘플 코드도 google 할 수 없었다. 어떤 페이지가 보입니까? 이상한, 누군가가 전에 그것을해야합니다 :) 예, 나는 최종 SQL에서 ORDER BY가, 이것은 단지 짧은 예입니다. 정보 주셔서 감사. 대량로드 (동일한 테이블에서 초당 수십 개의 삽입/업데이트/선택) 중에 교착 상태 (페이지 수준 잠금)가 발생하기 때문에 WITH (ROWLOCK)이 필요합니다. 나는 그것의 찬성과 동전 (자물쇠 확대 등)을 알고 있습니다. – Barney

+1

CTE에서 두 개의'WITH (NOLOCK) '을 제거 할 수 있습니까? 나는 그것이 충돌의 원천이 될 것이라고 생각한다. –

답변

2

NOLOCK 수정 될 테이블을 참조하는 쿼리 부분에는 적용되지 않습니다. SQL Server 업데이트 문에서 테스트하는 동안 각 행을 잠급니다. 교착 상태 회피 메커니즘입니다. 그것은 읽기를 위해 각 S-lock 행을 여러 번 업데이트하지 못하게하고 X-lock을 시도합니다.

U 자물쇠를 AFAIK로 만들 수 없습니다.

update t1 
set ... 
from T t1 with (rowlock) 
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...) 

이 약간의 오버 헤드를 추가하지만 그것은 당신이 읽기 NOLOCK을 사용할 수 있습니다 :하지만 당신은 가입 자체에 의해 abolute 최소 U가 고정 행의 양을 줄일 수 있습니다.

읽기에 스냅 샷 격리 사용을 고려하십시오. NOLOCK에는 쿼리가 임의로 중단되는 것과 같은 특정 문제가 있습니다.