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 / 147624
Accepted
BVernon
BVernon
Asked: 2016-08-24 08:49:09 +0800 CST2016-08-24 08:49:09 +0800 CST 2016-08-24 08:49:09 +0800 CST

Instruções de atualização com nível de isolamento de transação definido lido não confirmado

  • 772

Se eu tiver um procedimento armazenado com set transaction isolation level read uncommitted, isso afetará as instruções de atualização?

Eu sei que você não deve usar with (nolock)instruções on update/delete, e isso faz praticamente a mesma coisa, mas não tenho certeza se o SQL o ignora nas instruções update no procedimento ou se devo ter cuidado para não usá-lo se houver instruções update.

EDITAR:

Desculpe pela confusão. Não estou tentando descobrir qual seria o efeito de usar esse tipo de bloqueio em instruções de manipulação ou se é uma boa ideia. Na verdade, NÃO quero usar esse tipo de bloqueio nas instruções de manipulação e, portanto, minha pergunta é se colocar "definir transação ..." no topo do meu procedimento armazenado será honrado por instruções de atualização/exclusão ou se será ignorado. Minha esperança é que seja simplesmente ignorado.

Estou plenamente ciente dos efeitos (com seus prós e contras) que isso terá nas declarações selecionadas.

sql-server locking
  • 3 3 respostas
  • 14504 Views

3 respostas

  • Voted
  1. Martin Smith
    2016-08-24T13:44:42+08:002016-08-24T13:44:42+08:00

    Se eu tiver um procedimento armazenado com nível de isolamento de transação definido lido não confirmado, isso afetará as instruções de atualização?

    Leitura não confirmada permite leituras sujas. Um Xbloqueio será obtido na linha ou no nível superior (na página de dados ou no índice) antes de ficar sujo. As linhas acessadas diretamente pela consulta ao localizar uma linha para atualizar receberão um Ubloqueio e serão bloqueadas.

    No entanto, ainda é possível que uma atualização seja afetada pelo nível de isolamento.

    Conexão 1

    CREATE TABLE T1
    (
    X INT NULL,
    Y INT NULL
    );
    
    INSERT INTO T1 DEFAULT VALUES;
    
    BEGIN TRAN
    UPDATE T1 SET X = 100;    
    
    WAITFOR DELAY '00:00:10'
    
    ROLLBACK;
    

    Conexão 2 (execute isso dentro de 10 segundos após disparar a conexão 1)

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    
    UPDATE T1
    SET    Y = (SELECT SUM(X)
                FROM   T1);
    
    SELECT *
    FROM   T1; 
    

    Resultado

    insira a descrição da imagem aqui

    A operação de leitura lia o valor não confirmado e o resultado final era usado UPDATEmesmo que o 100que foi lido fosse eventualmente revertido.

    • 5
  2. Best Answer
    jyao
    2016-08-24T09:04:34+08:002016-08-24T09:04:34+08:00

    "Nível de isolamento da transação" afeta principalmente (no meu entendimento) o comportamento da operação de leitura, ou seja, se uma operação de leitura emitirá alguns bloqueios. No caso de "ler não confirmado", aqui está uma citação do MSDN

    As transações executadas no nível READ UNCOMMITTED não emitem bloqueios compartilhados para evitar que outras transações modifiquem os dados lidos pela transação atual. As transações READ UNCOMMITTED também não são bloqueadas por bloqueios exclusivos que impediriam a transação atual de ler linhas que foram modificadas, mas não confirmadas por outras transações

    Portanto, para sua pergunta, a resposta é NÃO, a atualização não será afetada pelo nível de isolamento de transação "ler não confirmado" dentro do mesmo procedimento armazenado.

    -- Update (uma amostra para provar essa lógica) No SSMS, abrimos duas janelas e, na Janela 1 (W1 daqui em diante), executamos o seguinte

    use tempdb
    create table dbo.t (a int)
    go
    insert into dbo.t (a) values (10)
    go
    begin tran
    update dbo.t 
    set a = 20
    where a = 10
    
    -- commit tran
    

    Em outra janela (W2), execute o seguinte (consulte os comentários para o comportamento)

    use TempdB
    set transaction isolation level read uncommitted
    select * from dbo.t -- you can have dirty read, showing [a]=20, which is an uncommitted UPDATE in W1
    
    go
    -- the following update will wait (before proper locks are granted)
    update dbo.t 
    set a = 30
    where a= 10
    

    Isso significa que a instrução UPDATE em W2 (com READ UNCOMMITTED) não é afetada pelo nível de isolamento da transação (isto é, ainda se comporta como esperado) como a instrução SELECT.

    -- UPDATE 2: De acordo com MSDN UPDATE t-sql,

    COM ( Table_Hint_Limited )

    Especifica uma ou mais dicas de tabela que são permitidas para uma tabela de destino. A palavra-chave WITH e os parênteses são obrigatórios. NOLOCK e READUNCOMMITTED não são permitidos. Para obter informações sobre dicas de tabela, consulte Dicas de tabela (Transact-SQL).

    Portanto, meu entendimento é que, quando você executa a instrução UPDATE, no SQL Server, não há como atualizar dados sujos (ou seja, dados não confirmados), mesmo que você possa ler os dados sujos em sua sessão.

    • 4
  3. Kin Shah
    2016-08-24T12:58:45+08:002016-08-24T12:58:45+08:00

    Com base na sua edição, agora a dúvida ficou mais clara..

    então, minha pergunta é se colocar "definir transação ..." no topo do meu procedimento armazenado será honrado por instruções de atualização/exclusão ou se será ignorado.

    O nível de isolamento da transação deve ser pensado em termos de operações de leitura. Os níveis de isolamento controlam como as operações de leitura são protegidas das outras operações de gravação.

    O mecanismo de banco de dados controla o comportamento de bloqueio de todas as operações de gravação e você não pode alterar esse comportamento no nível do banco de dados.

    De BOL :

    Todos os níveis de isolamento sempre emitem bloqueios exclusivos para operações de gravação e mantêm os bloqueios durante toda a duração da transação.

    Leia :

    • Como defino o nível de isolamento de transação padrão para operações de gravação?
    • Níveis de Isolamento da Transação
    • Todas as atualizações são divididas em excluir-inserir?
    • 3

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