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 / 206485
Accepted
user123215
user123215
Asked: 2018-05-12 05:05:22 +0800 CST2018-05-12 05:05:22 +0800 CST 2018-05-12 05:05:22 +0800 CST

Melhor situação para usar o nível de isolamento READ UNCOMMITTED

  • 772

Como todos sabemos, READ UNCOMMITTED é o nível de isolamento mais baixo no qual coisas como leituras sujas e leituras fantasmas podem ser acumuladas. Qual é o melhor momento para usar esse nível de isolamento e por quais motivos ele pode ser usado?

Na verdade eu li as respostas antes, mas não consegui entender completamente porque não havia exemplos suficientes.

sql-server deadlock
  • 6 6 respostas
  • 5879 Views

6 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2018-05-12T05:27:38+08:002018-05-12T05:27:38+08:00

    Eu uso READ_UNCOMMITTED(ou NOLOCK) ao consultar bancos de dados de produção do SSMS, mas não rotineiramente do código do aplicativo. Essa prática (juntamente com uma dica de consulta MAXDOP 1) ajuda a garantir que consultas casuais para análise de dados e solução de problemas não afetem a carga de trabalho de produção, entendendo que os resultados podem não estar corretos.

    Infelizmente, vejo READ_UNCOMMITTED/ NOLOCKusado amplamente no código de produção para evitar o bloqueio em detrimento da integridade dos dados. A solução adequada é um nível de isolamento de versão de linha ( SNAPSHOTou READ_COMMITTEDcom a READ_COMMITTED_SNAPSHOTopção de banco de dados ON) e/ou atenção ao ajuste de consulta e índice.

    Recentemente, revisei o código de um proc em que a única alteração foi remover NOLOCKporque às vezes retornava resultados errados. A remoção NOLOCKfoi uma coisa boa, mas, sabendo que linhas perdidas ou duplicadas normalmente acontecem durante varreduras de ordem de alocação de tabelas grandes, sugeri também refatorar para usar uma UNION ALLtécnica para promover o uso eficiente do índice. A consulta agora é executada em alguns milissegundos com resultados corretos, o melhor de todos os mundos.

    • 24
  2. Erik Darling
    2018-05-12T05:55:30+08:002018-05-12T05:55:30+08:00

    Eu acho que está tudo bem em algumas circunstâncias, desde que você aceite as consequências e não tenha outras opções.

    Para outras opções, eu levaria as pessoas a usar o Read Committed Snapshot Isolation (RCSI) para novos aplicativos ou SNAPSHOT ISOLATION (SI) para aplicativos mais antigos, onde você não pode testar facilmente toda a base de código para condições de corrida com RCSI.

    No entanto, esses podem não ser um bom ajuste. Você pode precisar gastar algum tempo extra amando e cuidando do tempdb e certificando-se de que ninguém deixe uma transação aberta que faça o armazenamento de versão (e o tempdb) crescer e encher o disco.

    Se você não tiver um DBA ou alguém cujo trabalho seja monitorar e gerenciar seu SQL Server, essas opções podem ser perigosas. De maneira mais geral, nem todos têm controle total do código que vai para o servidor, onde podem alterar a string de conexão ou o código para solicitar o SI para consultas de problemas.

    Além disso, a maioria das pessoas não tem problemas de bloqueio com toda a sua aplicação . Eles têm problemas com coisas como relatórios de dados OLTP. Se você pode aceitar as compensações do NOLOCK/RU em troca desses relatórios não serem bloqueados pelos escritores, vá em frente.

    Apenas certifique-se de entender o que isso significa. Isso não significa que sua consulta não tenha bloqueios, significa que não respeita os bloqueios retirados por outras consultas.

    E, claro, se o seu problema for o bloqueio de gravador/gravador, a única opção que ajudará é o SI, mas seria necessário uma quantidade incrível de trabalho do desenvolvedor para implementar isso adequadamente com tratamento de erros, etc.

    • 8
  3. Gaius
    2018-05-12T05:13:48+08:002018-05-12T05:13:48+08:00

    IMHO o único caso de uso válido para READ UNCOMMITTED em um sistema moderno é ao depurar uma sessão de outra em desenvolvimento, para que você possa ver o que está fazendo enquanto, por exemplo, um proc armazenado ainda está em execução. Normalmente, ele nunca seria usado em um sistema de produção. Pode haver algum ganho de desempenho menor, mas a longo prazo nunca valerá a pena.

    • 5
  4. James
    2018-05-12T05:48:44+08:002018-05-12T05:48:44+08:00

    Nós o usamos em cuidados de saúde o tempo todo.

    É surpreendentemente raro que linhas individuais de dados mudem no meio da consulta, e a taxa de leitura/gravação é de 10.000/1 - e a maioria delas são inserções, não atualizações. Por exemplo, quando a interface do laboratório grava os resultados do laboratório de um paciente no banco de dados, esses valores nunca serão alterados.

    Quando os dados mudam , eles mudam uma linha de cada vez. Ninguém está atualizando colunas inteiras (exceto um DBA, quando eles bagunçam muito).

    Por outro lado, executamos um monte de consultas para verificar coisas como pacientes voltando ao pronto-socorro em 72 horas ou menos, o que absolutamente martela as mesas.

    Em 10 anos de SQL de cuidados com a saúde, nunca vi um arquivo Rollback Transaction. Quero entrar e sair sem interromper a experiência do usuário final. Se houver um alto risco de desacelerar o banco de dados OLTP e um baixo risco de obter dados incorretos, farei NOLOCK.

    Devemos usá-lo? Talvez talvez não. De um modo geral, eu não diria que muitos dos bancos de dados de aplicativos em que trabalhei são bem projetados. Eles são normalmente repletos de anti-padrões.

    Você pode estar interessado nesta postagem de blog bacana de Paul White sobre READ UNCOMMITTED, especialmente a seção "Ler dados corrompidos": O nível de isolamento não confirmado de leitura

    • 3
  5. GirKarr
    2018-05-17T09:43:18+08:002018-05-17T09:43:18+08:00

    READ_UNCOMMITTED/NOLOCKé uma boa opção quando a precisão dos dados não é realmente o objetivo principal. Às vezes, quando uma contagem agregada aproximada é tudo o que é necessário. Por exemplo: Existem procedimentos armazenados que são usados ​​para tabelas INSERT ou UPDATE. Às vezes o número de registros a serem atualizados ou inseridos é enorme (Milhares de registros). Durante essas execuções de procedimento armazenado, podemos executar uma consulta de seleção simples NOLOCKna tabela de destino periodicamente para ver se ela progride sem problemas (para consulta de atualização, se você tiver uma coluna de alteração de status para registros sendo atualizados, podemos usar essa coluna para executar a group byconsulta com NOLOCKpara descobrir se a contagem de alterações de status está mudando constantemente).

    • 1
  6. SQLRaptor
    2018-05-12T08:15:33+08:002018-05-12T08:15:33+08:00

    Esteja ciente de que READ UNCOMMITTED apresenta problemas de consistência adicionais, não apenas leituras sujas. Dependendo do método de acesso, você pode perder linhas ou até ler a mesma linha mais de uma vez. Se você estiver interessado nos detalhes, leia o artigo de Itzik Ben-Gan

    • 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