Se o cliente demorar muito tempo para receber dados e, por sua vez, enviar ao SQL Server a confirmação de que recebeu os dados que o SQL Server precisa aguardar, devido a essa espera, o SQL Server não liberará os bloqueios retidos pela consulta, a menos que seja recebida uma confirmação do cliente.
Isso não é exato, depende do nível de isolamento.
Nos READ COMMITTEDbloqueios padrão, não são mantidos durante a execução das instruções. READ COMMITTEDnão fornece consistência de leitura no nível da instrução, a única garantia é que você não pode ler dados não confirmados. Um bloqueio compartilhado é adquirido e mantido para ler a linha e, em seguida, liberado.
A menos que você tenha tipos de LOB.
Os tipos de LOB, sendo potencialmente muito grandes, não podem ser armazenados em buffer. Um bloqueio compartilhado deve ser adquirido e mantido até que a instrução seja concluída, fornecendo essencialmente um REPEATABLE READcomportamento em READ COMMITTED.
Se eu estiver fazendo uma única chamada para um banco de dados MSSQL em uma rede de alta latência, os bloqueios de tabela ocorrerão devido a essa latência?
A latência não está causando o bloqueio da tabela, não. No entanto, se um bloqueio de tabela foi adquirido, a latência vai prolongá-lo.
Para citar alguém que conhece a mecânica disso melhor do que eu ( @RemusRusanu ):
Os resultados são retornados ao programa cliente à medida que a execução prossegue. À medida que as linhas "borbulham" na árvore de execução, o operador principal geralmente é encarregado de gravar essas linhas nos buffers de rede e enviá-las de volta ao cliente. O resultado não é criado primeiro em algum armazenamento intermediário (memória ou disco) e depois enviado de volta ao cliente; em vez disso, é devolvido conforme está sendo criado (à medida que a consulta é executada). O envio do resultado de volta ao cliente está, obviamente, sujeito ao protocolo de controle de fluxo de rede. Se o cliente não estiver consumindo ativamente o resultado (por exemplo, chamando SqlDataReader.Read ()), eventualmente o controle de fluxo precisará bloquear o lado de envio (a consulta que está sendo executada) e, por sua vez, suspenderá a execução do inquerir.[fonte]
Onde os resultados não são consumidos tão rapidamente quanto o SQL Server pode entregá-los, seja devido ao cliente ou à rede, vemos as ASYNC_NETWORK_IOesperas se acumulando. Para reiterar, isso não influenciará os bloqueios adquiridos, apenas a duração em que eles são mantidos.
nolockdica, sempre haverá um bloqueio . A latência apenas determina quanto tempo o bloqueio será mantido.