AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 78061
Accepted
Evan M
Evan M
Asked: 2014-10-01 08:46:45 +0800 CST2014-10-01 08:46:45 +0800 CST 2014-10-01 08:46:45 +0800 CST

O aumento da latência da rede causará bloqueios de tabela no MS SQL Server?

  • 772

Se eu estiver fazendo uma única chamada para um banco de dados SQL Server em uma rede de alta latência, ocorrerão bloqueios de tabela devido a essa latência? Digamos que eu consulte a tabela A para alguns registros e o SQL Server precise retornar esses dados em uma rede lenta - haverá um bloqueio de leitura na tabela A enquanto o servidor envia a resposta pela rede ou o SQL Server libera o bloqueio antes de enviar a resposta?

Além disso, a resposta varia com base no tamanho da resposta? Se tivesse que retornar apenas alguns KB em vez de várias centenas de MB, isso faria diferença?

Criar uma transação explícita, executar consultas e fechar a transação obviamente causaria o bloqueio das tabelas, pois a duração da transação está correlacionada com minha latência.

sql-server locking
  • 3 3 respostas
  • 4272 Views

3 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2014-10-01T11:04:04+08:002014-10-01T11:04:04+08:00

    Se o cliente demorar muito para receber os dados e, por sua vez, enviar ao SQL Server a confirmação de que recebeu os dados, o SQL Server terá que esperar, devido a essa espera, o SQL Server não liberará os bloqueios mantidos pela consulta, a menos que a confirmação seja recebida do cliente.

    Isso não é preciso, depende do nível de isolamento.

    No padrão, os READ COMMITTEDbloqueios não são mantidos durante a execução das instruções. READ COMMITTEDnão fornece consistência de leitura em nível de 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 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, essencialmente dando a você o 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, ocorrerão bloqueios de tabela devido a essa latência?

    A latência não está causando o travamento da mesa, não. No entanto, se um bloqueio de tabela foi adquirido, a latência irá prolongá-lo.

    Para citar alguém que conhece a mecânica disso melhor do que eu ( @RemusRusanu ):

    Os resultados são devolvidos ao programa cliente à medida que a execução prossegue. À medida que as linhas 'borbulham' na árvore de execução, o operador principal geralmente recebe a tarefa de gravar essas linhas em 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, é enviado de volta conforme está sendo criado (conforme 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 terá que bloquear o lado de envio (a consulta que está sendo executada) e isso, por sua vez, suspenderá a execução do consulta.[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 ASYNC_NETWORK_IOesperas se acumulando. Para reiterar, isso não influenciará os bloqueios adquiridos, apenas a duração em que são mantidos.

    • 15
  2. Evan M
    2014-10-01T13:19:32+08:002014-10-01T13:19:32+08:00

    A resposta de Mark esclareceu muito da minha confusão, mas gostaria de postar minhas descobertas depois de testar isso usando o NetBalancer para emular a latência.

    Fiz minha máquina local chamar um servidor SQL remoto e executar SELECTs e INSERTs em uma tabela dentro de uma pequena transação. Na máquina remota, conectei-me à instância SQL local e usei um loop WHILE para iterar repetidamente na tabela sys.dm_tran_locks, procurando por bloqueios na tabela que estava modificando e lendo. Instalei o NetBalancer no servidor e o usei para emular a latência de rede na conexão de rede do servidor.

    Aqui está o que eu encontrei:

    • Para instruções que não retornam muitos dados ao cliente, a latência não afeta o bloqueio. Eu estava retornando apenas algumas centenas de bytes de dados, no máximo. A transação na minha máquina tinha um WAITFOR de 250ms que mantinha os bloqueios e, quando aumentei a latência da rede para 5000ms, a duração do bloqueio ficou próxima a 250ms.
    • Para instruções que retornam muitos dados, a latência definitivamente afeta o bloqueio . Devolvi dezenas de milhares de linhas ao cliente e, sem latência, a duração do bloqueio foi curta. Quando aumentei a latência, os bloqueios continuaram até receber todos os dados.

    A partir disso, estou concluindo que a latência não importa, desde que os dados caibam no buffer de rede. Se o SQL tiver que colocar muitos dados no buffer de rede, a latência fará com que o buffer faça backup e o SQL manterá os bloqueios da tabela até que possa colocar todos os resultados da consulta no buffer.

    • 9
  3. Shanky
    2014-10-01T09:58:44+08:002014-10-01T09:58:44+08:00

    Se eu estiver fazendo uma única chamada para um banco de dados MSSQL em uma rede de alta latência, ocorrerão bloqueios de tabela devido a essa latência?

    Quando uma consulta é disparada e concluída pelo SQL Server, ela produz os resultados, coloca-a no buffer de saída e a envia ao cliente, que busca o resultado no buffer de saída. O SQL Server não liberará os bloqueios mantidos pela consulta, a menos que a confirmação seja recebida do cliente. O que pode causar bloqueio.

    Editar: Evan, você pode consultar este artigo de suporte do MS

    Na seção 3

    Bloqueio causado por um SPID cujo aplicativo cliente correspondente não buscou todas as linhas de resultado até a conclusão

    Depois de enviar uma consulta ao servidor, todos os aplicativos devem buscar imediatamente todas as linhas de resultado até a conclusão. Se um aplicativo não buscar todas as linhas de resultado, bloqueios podem ser deixados nas tabelas, bloqueando outros usuários. Se você estiver usando um aplicativo que envia instruções SQL de forma transparente ao servidor, o aplicativo deve buscar todas as linhas de resultado. Caso contrário (e se não puder ser configurado para isso), talvez você não consiga resolver o problema de bloqueio. Para evitar o problema, você pode restringir aplicativos mal-comportados a um relatório ou banco de dados de suporte à decisão.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve