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 COMMITTED
bloqueios padrão, não são mantidos durante a execução das instruções. READ COMMITTED
nã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 READ
comportamento 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_IO
esperas se acumulando. Para reiterar, isso não influenciará os bloqueios adquiridos, apenas a duração em que eles são mantidos.
nolock
dica, sempre haverá um bloqueio . A latência apenas determina quanto tempo o bloqueio será mantido.