programing

SELECT 쿼리의 SQL Server LOCKS 이해

fastcode 2023. 4. 15. 09:32
반응형

SELECT 쿼리의 SQL Server LOCKS 이해

이 있는지 SELECT WITH (NOLOCK)에 을 주는 가 "Discription"뿐일SELECT의합니니다다

SQL Server?할할 would would would would ?SELECT 것을 차단하다SELECT 명령어?

Server 2012를 DataContext.

(편집)

퍼포먼스에 대해서:

  • 번째가 될까요?SELECT 번째 기회를 SELECT로 잠근 을 SELECT
  • 와 a의 SELECT WITH (NOLOCK)

A SELECTSQL Server에서 테이블 행에 공유 잠금을 설정합니다.SELECT또한 공유 잠금이 필요하며 이러한 잠금이 서로 호환성이 있습니다.

no - one 러러 so so so so so so soSELECT 것을 수 없다SELECT.

,, … ...WITH (NOLOCK)query hint는 (다른 연결에 의해) 삽입되고 아직 커밋되지 않은 데이터를 읽을 수 있도록 하기 위해 사용됩니다.

힌트가 , 「」는 「」입니다.SELECT인 표 될 수 .INSERT (오류)UPDATE해당 작업의 트랜잭션이 커밋(또는 롤백)될 때까지 행(또는 테이블 전체)에 배타적 잠금을 설정합니다.

WITH (NOLOCK) 행을 수 .INSERT 따라서 실제로 데이터베이스에 커밋되지 않은 데이터가 보고서에 표시될 수 있습니다.

바로 이 힌트입니다.WITH (READPAST)는 " " " 입니다SELECT읽기를 시도하고 독점적으로 잠긴 행을 건너뜁니다.SELECT는 차단되지 않으며 "오류된" 비오류 데이터를 읽지는 않지만 일부 행은 건너뛸 수 있습니다(예: 테이블 내의 모든 행이 표시되지 않음).

퍼포먼스에서는 계속 선택에만 집중합니다.
공유는 읽기를 차단하지 않습니다.
공유 잠금 블록 업데이트.
수백 개의 공유 잠금이 있는 경우 공유 잠금이 클리어될 때까지 기다려야 하므로 전용 잠금을 얻으려면 업데이트에 시간이 걸립니다.

기본적으로 선택(읽기)은 공유 잠금을 사용합니다.
공유(S) 잠금을 사용하면 동시 트랜잭션이 리소스를 읽을 수 있습니다(SELECT).
공유 잠금은 다른 선택 항목(1 또는 1000)에 영향을 주지 않습니다.

차이점은 놀록과 공유 잠금이 업데이트 또는 삽입 작업에 미치는 영향입니다.

리소스에 공유(S) 잠금이 있는 동안에는 다른 트랜잭션은 데이터를 수정할 수 없습니다.

!!잠!!!!!!!!!!!!
놀람

이는 업데이트 성능에 큰 영향을 미칠 수 있습니다.인서트에도 영향을 줍니다.

지저분한 읽기(nolock)는 지저분하게 들린다.당신은 절대 부분 데이터를 얻을 수 없습니다.만약 업데이트가 존을 샐리로 바꾼다면 당신은 절대 졸리를 얻지 못할 것이다.

동시성을 위해 공유 잠금을 많이 사용합니다.데이터를 읽자마자 오래된 데이터입니다.존이 다음 밀리초 동안 샐리로 바뀌는 것은 오래된 데이터입니다.다음 밀리초 후에 존이 롤백되는 샐리의 읽기는 오래된 데이터입니다.그것은 밀리초 수준입니다.사용자가 공유 잠금을 사용하는 경우 실행하는데 20시간이 걸리고 사용자가 잠금을 사용하지 않는 경우 실행하는데 4시간이 걸립니다.이 경우 공유 잠금으로 인해 데이터가 16시간 동안 비활성화됩니다.

놀림을 잘못 사용하지 마세요.하지만 그들은 자리가 있다.바이트가 1로 설정되어 있을 때 수표를 절단하고 나서 체크가 절단되었을 때 2로 설정할 경우 놀락 시간이 아닙니다.

중요한 멘트를 하나 덧붙여야겠어요.가 그 말을 있다.NOLOCK더러운 데이터만 읽습니다.이것은 정확하지 않다.같은 행을 두 번 받거나 전체 행을 읽는 동안 건너뛸 수도 있습니다.그 이유는 SQL Server가 b-tree를 재조정할 때 동시에 일부 데이터를 요구할 수 있기 때문입니다.

다른 스레드 확인

https://stackoverflow.com/a/5469238/2108874

http://www.sqlmag.com/article/sql-server/quaere-verum-clustered-index-scans-part-iii.aspx)

NOLOCK 힌트(또는 세션의 분리 수준을 READ UNCOMMITITED로 설정)를 사용하여 SQL Server에 일관성을 기대하지 않는다는 것을 알립니다.따라서 보증은 없습니다.그러나 "데이터 불일치"는 나중에 롤백된 커밋되지 않은 변경이나 트랜잭션의 중간 상태에서의 데이터 변경을 볼 수 있음을 의미하는 것만은 아닙니다.또한 모든 테이블/인덱스 데이터를 검색하는 단순 조회에서 SQL Server가 검색 위치를 잃거나 동일한 행을 두 번 받게 될 수 있습니다.

저희 회사에서는 여러 대의 PC에서 동시에 실행되는 매우 큰 시스템이 있으며, 수십만 개의 행이 있는 매우 큰 테이블이 있으며, 때로는 수백만 개의 행이 있는 경우도 있습니다.

매우 큰 테이블에서 SELECT를 작성했을 때, 예를 들어 사용자가 지난 10년간 수행한 모든 트랜잭션을 파악하고 테이블의 기본 키가 효율적으로 작성되지 않았다고 가정하면 쿼리를 실행하는 데 몇 분 정도 걸릴 수 있습니다.

그러면 어플리케이션이 여러 사용자의 PC에서 동시에 실행되어 동일한 데이터베이스에 액세스할 수 있습니다.따라서 다른 한쪽 SELECT가 읽고 있는 테이블에 누군가가 삽입하려고 하면(SQL이 읽으려고 하는 페이지에), LOCK이 발생하여 2개의 트랜잭션이 서로 차단될 수 있습니다.

많은 사용자가 동시에 많이 사용하는 테이블 위의 거대한 SELECT이고 항상 LOCK이 있었기 때문에 SELECT 문에 "NO LOCK"를 추가해야 했습니다.

제 예가 충분히 명확할지는 모르겠습니다.이것은 실제 사례입니다.

SELECT WITH (NOLOCK) 않은 데이터를 수 는 커밋되지 않은 데이터의합니다.이것은, 다음의 데이터를 가지는 것과 같습니다.READ UNCOMMITTED데이터베이스에 설정된 분리 수준입니다.NOLOCK키워드를 사용하면 데이터베이스 전체의 분리 레벨을 설정하는 것보다 세밀한 제어를 할 수 있습니다.

위키피디아에는 다음과 같은 유용한 기사가 있습니다.위키백과: 격리(데이터베이스 시스템)

또한 다른 stackoverflow 기사에서도 자세히 설명합니다.

잠금 없이 선택 - 삽입하거나 삽입하지 않을 수 있는 레코드를 선택합니다.당신은 더러운 데이터를 읽을 것이다.

예를 들어 - 트랜잭션이 1000개의 행을 삽입한 후 실패했다고 가정합니다.

선택하면 1000 행이 표시됩니다.

언급URL : https://stackoverflow.com/questions/12608780/understanding-sql-server-locks-on-select-queries

반응형