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 / 40738
Accepted
Travis
Travis
Asked: 2013-04-24 12:29:39 +0800 CST2013-04-24 12:29:39 +0800 CST 2013-04-24 12:29:39 +0800 CST

ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT

  • 772

A maioria do fórum e exemplo on-line sempre sugere ter ambos ALLOW_SNAPSHOT_ISOLATIONe READ_COMMITTED_SNAPSHOTdefinir como LIGADO sempre que alguém estiver fazendo um instantâneo, controle de versão de linha ou pergunta semelhante.

Acho que a palavra INSTANTÂNEO em ambas as configurações fica um pouco confusa. Eu pensei que, para que o mecanismo de banco de dados usasse o controle de versão de linha em vez de bloqueios para o comportamento padrão READ_COMMITTED, o banco de dados READ_COMMITTED_SNAPSHOTé definido como ON, independentemente de qual ALLOW_SNAPSHOT_ISOLATIONconfiguração.

A ALLOW_SNAPSHOT_ISOLATIONconfiguração é definida como ON somente para permitir o isolamento de instantâneo ao iniciar uma transação (por exemplo, SET TRANSACTION ISOLATION LEVEL SNAPSHOT) independentemente da READ_COMMITTED_SNAPSHOTconfiguração.

A única razão para ter essas duas configurações definidas como ON é quando ele precisa ter o controle de versão de linha READ COMMITTED E o isolamento de instantâneo.

Minha pergunta é, meu entendimento está incorreto de alguma forma? E que essas duas configurações devem ser sempre definidas como ON juntas (especialmente para o versionamento de linhas READ COMMITTED)?

sql-server isolation-level
  • 4 4 respostas
  • 58153 Views

4 respostas

  • Voted
  1. Best Answer
    Ali Razeghi - AWS
    2013-04-24T17:15:11+08:002013-04-24T17:15:11+08:00

    Seu entendimento está correto. Fica um pouco confuso.

    Kim Tripp (um dos programadores do SQL Server e parte integrante do SQLSkills) passa exatamente pelo que você afirmou nos vídeos do MCM no Snapshot Isolation ( link direto para download MP4 (544MB) ). Avance rápido para 41:45 no vídeo para chegar à parte em que ela responde à sua pergunta.

    Se você usar ALLOW_SNAPSHOT_ISOLATIONcertifique-se de usar SET TRANSACTION ISOLATION LEVEL SNAPSHOTem seu código, caso contrário você não obterá nenhum dos benefícios.

    Se você definir SET READ_COMMITTED_SNAPSHOT ON, não será necessário modificar nenhum código. O MS SQL Server aplica automaticamente o isolamento de instantâneo para essa tabela.

    Eu não testei para ver o que acontece se você solicitar um nível de isolamento diferente em seu código, suspeito que ele substituirá essa opção, mas teste-o primeiro.

    Uma rápida olhada na sobrecarga de desempenho usando o isolamento de instantâneo.

    Bom artigo sobre como o isolamento de instantâneo pode alterar o comportamento esperado do seu aplicativo . Ele mostra exemplos de como uma instrução de atualização e uma instrução de seleção podem retornar resultados totalmente diferentes e inesperados.

    • 30
  2. Travis
    2013-04-24T21:49:51+08:002013-04-24T21:49:51+08:00

    OK, voltei para casa e testei. Aqui fica a observação.

    CREATE DATABASE TEST;
    GO
    CREATE TABLE TABLE1
    (
        ID tinyint,
        Details varchar(10)
    );
    GO
    INSERT INTO TABLE1
    VALUES (1, 'Original');
    GO
    
    SELECT
        name,
        snapshot_isolation_state_desc,
        is_read_committed_snapshot_on
    FROM sys.databases
    WHERE name = 'TEST';
    GO
    

    Primeiro teste com ambas as configurações confirmadas como OFF.

    Consulta 1

    USE TEST;
    
    BEGIN TRAN
    UPDATE TABLE1
    SET Details = 'Update'
    WHERE ID = 1;
    
    --COMMIT;
    --ROLLBACK;
    GO
    

    Consulta 2

    USE TEST;
    
    SELECT ID, Details
    FROM TABLE1
    WHERE ID = 1;
    GO
    

    Neste teste, a consulta 2 está aguardando a confirmação da consulta 1, dm_tran_locks DMV mostra esse bloqueio exclusivo na TABELA1 incorrido pela consulta 1.

    USE TEST;
    
    SELECT
        DB_NAME(tl.resource_database_id) AS DBName,
        resource_type,
        OBJECT_NAME(resource_associated_entity_id) AS tbl_name,
        request_mode,
        request_status,
        request_session_id
    FROM sys.dm_tran_locks tl
    WHERE 
        resource_database_id = db_id('TEST')
        AND resource_type = 'OBJECT'
    

    Segundo teste , reverta a transação anterior, defina READ_COMMITTED_SNAPSHOT como LIGADO, mas deixe ALLOW_SNAPSHOT_ISOLATION DESLIGADO.

    ALTER DATABASE TEST
    SET READ_COMMITTED_SNAPSHOT ON
    WITH ROLLBACK IMMEDIATE;
    GO
    

    Execute a consulta 1 e execute a consulta 2. DMV mostra que a consulta 1 incorre em bloqueio exclusivo, mas a consulta 2 retorna detalhes com 'Original' sem que a consulta 1 confirme a transação. Parece que o controle de versão de linha READ_COMMITTED está em vigor.

    Adicionar SET TRANSACTION ISOLATION LEVEL SNAPSHOT;na consulta 1 e na consulta 2 e executar a consulta 1 ou a consulta 2 retorna erro - Falha na transação de isolamento de instantâneo ao acessar o banco de dados 'TEST' porque o isolamento de instantâneo não é permitido neste banco de dados. Use ALTER DATABASE para permitir o isolamento de instantâneo.

    Terceiro teste , reversão da transação anterior. Defina READ_COMMITTED_SNAPSHOT OFF e ALLOW_SNAPSHOT_ISOLATION ON.

    ALTER DATABASE TEST
    SET READ_COMMITTED_SNAPSHOT OFF
    WITH ROLLBACK IMMEDIATE;
    GO
    
    ALTER DATABASE TEST
    SET ALLOW_SNAPSHOT_ISOLATION ON;
    GO
    

    Execute a consulta 1 e, em seguida, a consulta 2. A DMV mostra o bloqueio exclusivo incorrido pela consulta 1. A consulta 2 parece estar aguardando a conclusão da consulta 1. Ativar ALLOW_SNAPSHOT_ISOLATION não parece habilitar o controle de versão de linha READ COMMITTED.

    Adicionando SET TRANSACTION ISOLATION LEVEL SNAPSHOT;à consulta 1 e à consulta 2. Execute a consulta 1 e, em seguida, a consulta 2. Enquanto o DMV mostra que a consulta 1 incorre em bloqueio exclusivo, a consulta 2 retorna os detalhes com 'Original'. O isolamento de instantâneo parece estar em vigor.

    A observação do teste mostra que READ_COMMITTED_SNAPSHOTele mesmo habilita/desabilita o versionamento de linha READ COMMITTED independentemente da ALLOW_SNAPSHOT_ISOLATIONconfiguração e vice-versa.

    • 16
  3. o.v
    2018-01-18T07:43:12+08:002018-01-18T07:43:12+08:00

    Seu entendimento está correto. Eu gosto da definição curta, limpa e simples daqui :

    Quando a opção de banco de dados READ_COMMITTED_SNAPSHOT está ATIVA, as transações que definem o nível de isolamento de leitura confirmada usam o controle de versão de linha.

    Quando a opção de banco de dados ALLOW_SNAPSHOT_ISOLATION está ATIVA, as transações podem definir o nível de isolamento do instantâneo.

    Parece que muito mal-entendido vem da própria MS. Por exemplo, aqui eles dizem:

    Se você definir a opção de banco de dados READ_COMMITTED_SNAPSHOT como ON, o mecanismo de banco de dados usará controle de versão de linha e isolamento de instantâneo como padrão, em vez de usar bloqueios para proteger os dados.

    Mas o mencionado "isolamento instantâneo" não é igual ao comportamento da transação para a qual set transaction isolation level snapshoté aplicado.

    Quanto à diferença, uma boa explicação está aqui .

    Provavelmente seria melhor se READ_COMMITTED_SNAPSHOT fosse nomeado como READ_COMMITTED_ROW_VERSIONING ou algo assim. :)

    • 7
  4. flam3
    2019-08-30T00:11:22+08:002019-08-30T00:11:22+08:00

    Eu gosto deste resumo da Microsoft :

    Definir a opção READ_COMMITTED_SNAPSHOT ON permite o acesso a linhas com versão no nível de isolamento READ COMMITTED padrão. Se a opção READ_COMMITTED_SNAPSHOT estiver definida como OFF, você deverá definir explicitamente o nível de isolamento do instantâneo para cada sessão para acessar as linhas com versã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

    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