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 / 106566
Accepted
dmoney
dmoney
Asked: 2015-07-11 00:41:54 +0800 CST2015-07-11 00:41:54 +0800 CST 2015-07-11 00:41:54 +0800 CST

Benefícios do SET TRANSACTION ISOLATION LEVEL LEAD UNCOMMITTED

  • 772

Eu uso SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDna maioria das minhas consultas SQL gerais, principalmente porque isso foi detalhado para mim quando originalmente aprendi a linguagem.

Do meu entendimento, esse nível de isolamento age da mesma maneira que WITH (NO LOCK), no entanto, eu só costumo usar arquivos SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

  • Existe algum momento que eu deveria estar usando WITH (NO LOCK)mais SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
  • Isso SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDimpede que outros usuários sejam bloqueados nas tabelas que estou lendo?
  • Se SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDé usado para parar bloqueios, mas estou apenas lendo dados, qual é o sentido de usá-lo? São apenas as consultas intensivas do sistema que gerariam bloqueios? Vale a pena usá-lo ao executar consultas que retornariam em, digamos, 5 a 10 segundos?
  • Foi-me dito para não usar SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDao ler dados que seriam usados ​​em atualizações, presumivelmente para evitar a atualização de dados sujos. Seria este o único motivo?
  • Com o tipo de banco de dados em que estou trabalhando, existe um ambiente de produção e teste. Raramente estaremos consultando o ambiente de produção, mas quando preciso, geralmente estarei usando SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDem minha consulta. Eu entendo que leituras sujas são possíveis com isso. Além de receber dados de volta que podem não ser confirmados no banco de dados (e, portanto, descartar meus resultados), que outros tipos de 'leituras sujas' poderiam ser possíveis?

Desculpe as perguntas em massa.

sql-server isolation-level
  • 3 3 respostas
  • 47579 Views

3 respostas

  • Voted
  1. Best Answer
    Ionic
    2015-07-11T01:48:40+08:002015-07-11T01:48:40+08:00

    É terrível, que você aprendeu dessa forma (desculpe!).

    READ UNCOMMITTEDvamos ler todas as linhas, sim. Mesmo aqueles que são usados ​​atualmente em uma operação INSERT, UPDATE. DELETEIsso é muito útil se você precisar dar uma olhada rápida em alguns dados ou em declarações de missão crítica SELECTem que um bloco seria muito prejudicial.

    Na verdade, você arrisca sua integridade. Pode ocorrer que você leia uma linha, que atualmente é usada para ser excluída ou em uma alteração. Também pode parecer que você leu um valor errado. Isso pode ser realmente incomum, mas pode acontecer. O que quero dizer com isso? Bem, pense em uma linha que é muito ampla (tem muitas colunas com muitas colunas longas nvarchar). Uma atualização ocorre nesta linha e define novos valores. Em casos raros, pode acontecer com você que você leia apenas meia linha. Outra coisa pode acontecer, por exemplo, se um usuário alterar seus valores de login. Ele muda seu e-mail + senha. O e-mail já está definido, mas a senha não. Desta forma, você tem um estado inconsistente.

    Sugiro esquecer READ UNCOMMITTED. Basta usá-lo onde for realmente necessário.

    Outra alternativa para você pode ser habilitar a READ_COMMITTED_SNAPSHOTopção de banco de dados - portanto, você pode usar READ COMMITTED SNAPSHOTdevido ao versionamento de linha habilitado em seu tempdb. Dessa forma, você acabou de ler outra versão (mais antiga) de uma linha. Isso não bloqueará suas consultas. Mas pode ocorrer que você leia um valor antigo também, mas um valor antigo consistente.

    Outra ideia pode ser WITH(READPAST)em vez de WITH(NOLOCK). Você lerá o estado antigo da tabela (um pouco como no SNAPSHOT ISOLATION), mas pulará todas as linhas atualmente bloqueadas.

    • 28
  2. Ubercoder
    2016-09-17T02:18:04+08:002016-09-17T02:18:04+08:00

    Como afirma a resposta aceita, esqueça de usar o nível de isolamento READ UNCOMMITTED (exceto quando realmente necessário), pois você corre o risco de ler dados errados. Mas para responder ao terceiro ponto da sua pergunta, existem duas situações que considero úteis:

    1. Ao escrever e testar pacotes SSIS do SQL Server, as etapas do pacote podem ser agrupadas em uma transação. Se você estiver testando um pacote executando-o passo a passo no depurador do SSIS, convém examinar as tabelas enquanto há bloqueios na tabela. O uso de SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED permite usar o SQL Server Manager Studio para examinar as tabelas enquanto o pacote está sendo depurado.

    2. No SQL Server Manager Studio, você pode testar o código T-SQL envolvendo-o em uma transação para oferecer a opção de reverter as alterações. Por exemplo, em um banco de dados de teste, você pode querer restaurar os dados para o estado inicial como parte de seu teste. Se você estiver testando o código encapsulado da transação e desejar verificar as tabelas bloqueadas enquanto a transação estiver em andamento, poderá usar SET TRANSACTION ISOLATION LEVEL LEVEL READ UNCOMMITTED para examinar os valores em outra janela.

    Eu aceito que esses são usos bastante obscuros para READ UNCOMMITTED, mas eu os achei úteis em um ambiente de teste.

    • 2
  3. Simon Holzman
    2016-12-10T12:34:08+08:002016-12-10T12:34:08+08:00

    Na maioria dos bancos de dados, a grande maioria das atividades, mesmo inserções, exclusões e atualizações, está fora das transações explícitas.

    Claro, READ UNCOMMITTED(Dirty Reads) pode fornecer informações incorretas nesses casos, mas essas informações estavam corretas 5 segundos antes.

    Os momentos em que as Dirty Reads produzem resultados genuinamente ruins são quando uma transação falha e precisa ser revertida ou ao executar uma consulta em duas tabelas que normalmente são atualizadas juntas usando uma transação explícita.

    Enquanto isso, em um banco de dados grande e ocupado típico que tem uma proporção de 100 (ou mais) para 1 de leituras para gravações, CADA consulta (leitura) que não usa Dirty Reads está deixando o sistema lento porque precisa obter e verificar para bloqueios E está tornando muito mais provável que as transações falhem (normalmente devido a Deadlocks), o que pode causar problemas mais sérios de integridade do banco de dados.

    Em vez disso, o uso de leituras sujas torna o sistema MUITO mais rápido e confiável (em parte devido ao desempenho aprimorado, tornando menos provável a ocorrência de inconsistências).

    Claro, há momentos em que eles não devem ser usados. Não gosto de definir o banco de dados como padrão para usar o READ UNCOMMITTEDnível de isolamento ou até mesmo usar a SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDinstrução explícita no início de scripts SQL e SPs - há muita chance de que uma leitura suja aconteça quando não deveria. Em vez disso, as (NOLOCK)dicas são uma abordagem muito melhor, pois indicam explicitamente que o programador pensou sobre o que estava fazendo e decidiu que, para essa tabela específica nesta consulta específica, as Dirty Reads eram seguras.

    Se você estiver programando um aplicativo para transferir dinheiro de uma conta bancária para outra, não deverá usar o Dirty Reads. Mas a maioria dos aplicativos não precisa desse nível de paranóia.

    • 2

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