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 / 47357
Accepted
Paul
Paul
Asked: 2013-08-01 07:12:15 +0800 CST2013-08-01 07:12:15 +0800 CST 2013-08-01 07:12:15 +0800 CST

Posso forçar um usuário a usar WITH NOLOCK?

  • 772

Posso forçar as consultas de um usuário a sempre serem executadas com a dica NOLOCK? por exemplo, eles digitam

select * from customer

Mas o que é executado no servidor é

select * from customer with (nolock)

Esta pergunta não é:
Sobre os vários prós e contras do NOLOCK, respeitosamente. Eu sei o que são, este não é o lugar para discuti-los.

sql-server sql-server-2008-r2
  • 4 4 respostas
  • 14324 Views

4 respostas

  • Voted
  1. Aaron Bertrand
    2013-08-01T07:30:32+08:002013-08-01T07:30:32+08:00

    A verdadeira resposta é:

    Pare de usar NOLOCK

    OUTRAS INFORMAÇÕES QUE PODEM SER ÚTEIS:

    Claro, negue o acesso direto às tabelas/exibições e imponha o acesso aos dados por meio de procedimentos armazenados (ou exibições - obrigado Martin) - que você pode codificar para usar NOLOCK.

    Se você precisa que seja por usuário e pode impor o acesso aos dados por meio de procedimentos, pode usar a ideia sugerida aqui por SQLMenace :

    CREATE PROCEDURE dbo.blah
    AS
    BEGIN
      SET NOCOUNT ON;
    
      IF SUSER_SNAME() = N'something'
      BEGIN
        SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
      END
    
      SELECT columns FROM dbo.Customer;
    END
    GO
    

    Ou você também pode fazer isso:

    CREATE PROCEDURE dbo.blah
    AS
    BEGIN
      SET NOCOUNT ON;
    
      IF SUSER_SNAME() = N'something'
      BEGIN
        SELECT columns FROM dbo.Customer WITH (NOLOCK);
    
        RETURN;
      END
    
      SELECT columns FROM dbo.Customer;
    END
    GO
    

    Se isso não for possível, pensei em sugerir um guia de plano , mas não os usei para fazer valer NOLOCK. Além disso , este documento nos Manuais Online sugere que isso é reservado para INDEX, FORCESCANe FORCESEEKdicas. Usar um guia de plano para tentar adicionar NOLOCKse ainda não estiver presente no texto da consulta levará a um erro. No entanto, o código mostrado no Exemplo K parece contradizer isso, então talvez valha a pena tentar, afinal. Obviamente, você precisará definir um guia de plano para cada consulta, o que pode ser proibitivo (ou impossível) e não é exatamente para os fracos de coração.

    E eu sei que você não quer ouvir os contras de NOLOCK, mas seria muito mais fácil (e melhor!) Forçar todos a usar o snapshot.

    Para abordar a sugestão de Kenneth de usar um gatilho de logon: em meus testes, essa opção SET pode ser especificada em um gatilho de logon, mas, como defini-la em um procedimento armazenado, a configuração reverte para o padrão do servidor quando o gatilho sai do escopo. Portanto, não parece haver uma maneira de definir o nível de isolamento de uma sessão de um gatilho de logon.

    • 18
  2. db2
    2013-08-08T08:02:41+08:002013-08-08T08:02:41+08:00

    Como outros já disseram: não use NOLOCK quer queira quer não. Há certos momentos em que é apropriado, e 'cada consulta de um usuário específico' provavelmente não é um deles. Use uma das opções melhores e mais seguras para lidar com a simultaneidade, ou seu LART favorito se você tiver um DBA/desenvolvedor rotineiramente sobrecarregando o sistema de produção com consultas terríveis.

    Sim, você pode ajustar a segurança para que eles possam selecionar apenas a partir de exibições que selecionam tabelas de base com dicas NOLOCK, e posso imaginar algumas situações em que isso pode ser necessário (a equipe de suporte operacional precisa examinar ocasionalmente os dados de produção em tempo real, talvez com algumas informações/colunas confidenciais omitidas também).

    Mas considere esta discussão semelhante:

    "Como posso levar meu carro até o terceiro andar?"

    "Por que você gostaria de fazer isso?"

    Se a resposta for "Porque minha empresa fica no terceiro andar e preciso exibir o carro para uma promoção / sorteio", comece a procurar maneiras de colocá-lo lá em cima.

    Mas se a resposta for "Porque eu gostaria de ir para casa, para meu apartamento no terceiro andar", então a recomendação adequada é "Estacione o carro no estacionamento, saia e pegue o elevador até o terceiro andar".

    Não transforme suposições e preconceitos em requisitos técnicos e não se prenda à sua primeira tentativa de solução. Dê um passo para trás e reavalie o que você deseja realizar.

    • 7
  3. Best Answer
    Fabricio Araujo
    2013-08-03T10:18:55+08:002013-08-03T10:18:55+08:00

    Parece que o mais próximo que você pode obter sem usar SPs é usar SET READ_COMMITTED_SNAPSHOT, o que afetará todos os usuários do banco de dados.

    A READ_COMMITTED_SNAPSHOTopção de banco de dados controla se o nível de isolamento READ_COMMITTEDé implementado como suas contrapartes em PostgreSQL e FirebirdSQL (instantâneo de registros em nível de instrução) ou usando bloqueio. Leia mais sobre isso na documentação:

    Bloqueio e controle de versão de linha

    Você comentou em resposta a outra resposta:

    Não há aplicação de controle no cenário em mente. É SSMS direto contra SQL2008R2 Standard Edition

    Você deve certificar-se de que todas as instalações estão definidas como Read Uncommitted em Tools/Options/Query Execution/SQL Server/Advanced. Eu não sou um SysAdmin de rede, então não sei se uma política pode resolver isso.

    • 5
  4. wBob
    2013-08-01T13:10:14+08:002013-08-01T13:10:14+08:00

    Semelhante à opção Database Snapshot ou com um espelho de relatório, mas que tal usar AlwaysOn e roteamento somente leitura com o SQL 2012? Você pode redirecionar uma conexão para o secundário legível por meio da faceta ApplicationIntent=ReadOnly da string de conexão.

    Faça com que seu aplicativo determine a cadeia de conexão, dependendo do nome do usuário, para que seja completamente transparente para o usuário. O secundário é mantido relativamente atualizado, dependendo da latência, sem a sobrecarga de manter um instantâneo do banco de dados.

    Cenário 1 O usuário sênior efetua login no aplicativo, o aplicativo determina que o usuário deve ter permissão de leitura/gravação. String de conexão criada para o banco de dados primário.

    Cenário 2 O usuário efetua login no aplicativo, o aplicativo determina que o usuário deve ter permissão somente leitura. Cadeia de conexão criada incluindo ApplicatonIntent=ReadOnly. Conexão feita ao banco de dados secundário legível. Se a atividade de gravação for necessária, será necessária uma conexão separada com o primário.

    Ouvintes de grupo de disponibilidade, conectividade de cliente e failover de aplicativo http://msdn.microsoft.com/en-us/library/hh213417.aspx#connecttosecondary

    "Cargas de trabalho somente leitura usam versão de linha para remover contenção de bloqueio nos bancos de dados secundários. Todas as consultas executadas nos bancos de dados secundários são mapeadas automaticamente para o nível de transação de isolamento de instantâneo, mesmo quando outros níveis de isolamento de transação são definidos explicitamente. Além disso, todas as dicas de bloqueio são ignorado. Isso elimina a disputa leitor/gravador."

    • 4

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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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