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
구문 적으로 유효한 명령문이지만 문제는 두 가지입니다. 명령문별로 순서가 없으므로 실제로 어떤 행을 업데이트할지 알지 못합니다. rowlock은 옵티 마이저에 대한 힌트 일 뿐이므로 사용할 수도 있고 사용하지 않을 수도 있습니다. 어쨌든 로크 록이 필요한 이유는 무엇입니까? –
@PaulMcLoughlin 답변 해 주셔서 감사합니다. 나는 'sql 조합'과 함께 어떤 샘플 코드도 google 할 수 없었다. 어떤 페이지가 보입니까? 이상한, 누군가가 전에 그것을해야합니다 :) 예, 나는 최종 SQL에서 ORDER BY가, 이것은 단지 짧은 예입니다. 정보 주셔서 감사. 대량로드 (동일한 테이블에서 초당 수십 개의 삽입/업데이트/선택) 중에 교착 상태 (페이지 수준 잠금)가 발생하기 때문에 WITH (ROWLOCK)이 필요합니다. 나는 그것의 찬성과 동전 (자물쇠 확대 등)을 알고 있습니다. – Barney
CTE에서 두 개의'WITH (NOLOCK) '을 제거 할 수 있습니까? 나는 그것이 충돌의 원천이 될 것이라고 생각한다. –