클라이언트가 데이터를 수신하는 데 오랜 시간이 걸리고 SQL Server가 수신 한 데이터를 수신했다는 확인을 SQL Server로 전송하는 경우이 대기로 인해 SQL Server는 클라이언트로부터 승인을받지 않으면 쿼리가 보유한 잠금을 해제하지 않습니다.
이것은 정확하지 않으며 격리 수준에 따라 다릅니다.
기본적으로 READ COMMITTED
잠금은 명령문 실행 기간 동안 유지되지 않습니다. READ COMMITTED
명령문 레벨의 읽기 일관성을 제공하지 않으면 커미트되지 않은 데이터를 읽을 수 없다는 것이 유일한 보증입니다. 공유 잠금이 확보되어 행을 읽은 후 해제됩니다.
LOB 유형이없는 한.
잠재적으로 매우 큰 LOB 유형은 버퍼링 할 수 없습니다. 공유 잠금은 기본적으로 당신에게주는 문이 완료 될 때까지 획득하고 유지해야 REPEATABLE READ
에서 동작을 READ COMMITTED
.
대기 시간이 긴 네트워크를 통해 MSSQL 데이터베이스를 단일 호출하는 경우 해당 대기 시간으로 인해 테이블 잠금이 발생합니까?
대기 시간으로 인해 테이블 잠금이 발생하지 않습니다. 그러나 테이블 잠금을 획득 한 경우 대기 시간이 연장됩니다.
나 ( @RemusRusanu ) 보다 이것의 역학을 잘 아는 사람을 인용하려면 :
실행이 진행됨에 따라 결과가 클라이언트 프로그램으로 다시 반환됩니다. 행이 실행 트리를 '거품'으로 만들면 최상위 연산자는 일반적으로 이러한 행을 네트워크 버퍼에 쓰고 클라이언트로 다시 보내는 작업을 수행합니다. 결과는 일부 중간 저장소 (메모리 또는 디스크)에 먼저 생성 된 다음 클라이언트로 다시 전송되지 않고 생성 된대로 (쿼리가 실행될 때) 다시 전송됩니다. 물론 결과를 클라이언트로 다시 보내는 것은 네트워크 흐름 제어 프로토콜의 적용을받습니다. 클라이언트가 적극적으로 결과를 소비하지 않으면 (예 : SqlDataReader.Read () 호출) 흐름 제어는 전송 측 (실행중인 쿼리)을 차단해야하며 결과적으로 실행을 일시 중단합니다 질문.[출처]
클라이언트 나 네트워크로 인해 SQL Server가 결과를 제공 할 수있는만큼 빠르게 결과가 소비되지 않는 경우 ASYNC_NETWORK_IO
대기 시간이 누적됩니다. 다시 말하지만, 이것은 획득 한 잠금에 영향을 미치지 않으며 잠금 유지 기간에만 영향을 미칩니다.
nolock
힌트 를 지정하지 않으면 항상 lock이 있습니다. 대기 시간은 잠금 보유 시간을 결정합니다.