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 / 318050
Accepted
John
John
Asked: 2022-10-11 12:11:17 +0800 CST2022-10-11 12:11:17 +0800 CST 2022-10-11 12:11:17 +0800 CST

Os pontos mais delicados dos gravadores bloqueando uns aos outros sob os níveis de isolamento de instantâneo

  • 772

O instantâneo confirmado de leitura e os níveis de isolamento de instantâneo no SQL Server eliminam a maioria dos bloqueios, exceto um: um gravador ainda bloqueia outros gravadores .

A documentação anda na ponta dos pés dizendo isso e, posteriormente, não documenta mais nada que seria muito interessante saber:

É realmente apenas uma linha modificada que fica bloqueada exclusivamente? Ou também podem ser linhas não relacionadas (por exemplo, adjacentes em um índice) ou páginas?

Eu dei uma olhada nos bloqueios sys.dm_tran_lockse só vi bloqueios exclusivos em linhas modificadas durante uma transação não confirmada - páginas onde meramente bloqueadas como IX.

Também testei se duas transações poderiam modificar duas linhas diferentes simultaneamente durante duas transações não confirmadas em uma tabela muito pequena que provavelmente caberia em uma página e que também funcionasse.

Se, de fato, apenas as linhas modificadas forem bloqueadas exclusivamente, isso daria a um aplicativo com acesso exclusivo ao banco de dados a garantia de escrita sem bloqueio se garantir que duas conexões não sejam gravadas simultaneamente na mesma linha.

Isso seria possível no cenário que tenho em mente - mas dificilmente há uma maneira de fazer algo assim se os bloqueios de página entrarem em jogo, pois é imprevisível quais linhas exatamente seriam afetadas.

sql-server locking
  • 1 1 respostas
  • 115 Views

1 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2022-10-12T02:29:50+08:002022-10-12T02:29:50+08:00
    Bloqueado por 32 minutos . Os comentários sobre esta resposta foram desativados, mas ainda está aceitando outras interações. Saiba mais .

    Regras gerais sobre bloqueios e escalonamento de bloqueios:

    Os bloqueios de nível de linha podem ser escalados para bloqueios de nível de tabela (ou nível de partição). Portanto, é possível que linhas não relacionadas sejam bloqueadas, sob determinadas circunstâncias.

    Essas circunstâncias estão documentadas aqui . Observe também que o escalonamento de bloqueio pode ser desabilitado com a LOCK_ESCALATIONopção de tabela.

    Além disso, alguns planos de consulta usam bloqueios de página, e alguns planos de consulta precisarão ler uma linha bloqueada por outra transação para determinar se ela deve ser modificada. Por exemplo update foo where someUnindexedColumn = 'someval', precisará ler todas as linhas e, portanto, será bloqueado por qualquer outro escritor.

    Observe isso (que precisaremos no último parágrafo):

    (i) Importante

    A escolha de um nível de isolamento de transação não afeta os bloqueios adquiridos para proteger as modificações de dados. Uma transação sempre obtém um bloqueio exclusivo em todos os dados que modifica e mantém esse bloqueio até que a transação seja concluída, independentemente do nível de isolamento definido para essa transação. Para operações de leitura, os níveis de isolamento da transação definem principalmente o nível de proteção contra os efeitos das modificações feitas por outras transações.

    Regras sobre SNAPSHOTo nível de isolamento :

    O termo "snapshot" reflete o fato de que todas as consultas na transação veem a mesma versão, ou snapshot, do banco de dados, com base no estado do banco de dados no momento em que a transação começa. Nenhum bloqueio é adquirido nas linhas de dados subjacentes ou páginas de dados em uma transação de instantâneo, o que permite que outras transações sejam executadas sem serem bloqueadas por uma transação anterior não concluída. As transações que modificam dados não bloqueiam transações que leem dados e transações que leem dados não bloqueiam transações que gravam dados , como normalmente fariam no nível de isolamento READ COMMITTED padrão no SQL Server. Esse comportamento sem bloqueio também reduz significativamente a probabilidade de deadlocks para transações complexas.

    Em suma, neste nível de isolamento:

    • o versionamento de linha é usado (em vez de bloqueios) para proteger as modificações de outras transações.
    • Os leitores não bloqueiam os leitores.
    • Os leitores não bloqueiam os escritores.
    • Escritores não bloqueiam leitores.

    No entanto, a documentação NÃO menciona que "escritores não bloqueiam escritores", portanto, podemos assumir que os escritores realmente PODEM bloquear escritores no nível de isolamento INSTANTÂNEO.

    Mais informações sobre como o instantâneo funciona podem ser encontradas em Bloqueio de transações e Controle de versão de linha :

    O isolamento de instantâneo também usa o controle de versão de linha, que não usa bloqueios compartilhados durante as operações de leitura.
    ...
    Quando as opções de banco de dados READ_COMMITTED_SNAPSHOT ou ALLOW_SNAPSHOT_ISOLATION estão LIGADAS, cópias lógicas (versões) são mantidas para todas as modificações de dados realizadas no banco de dados. Sempre que uma linha é modificada por uma transação específica, a instância do Mecanismo de Banco de Dados do SQL Server armazena uma versão da imagem confirmada anteriormente da linha em tempdb. ...

    e abaixo

    Comportamento ao modificar dados
    ... As
    transações executadas sob isolamento de instantâneo adotam uma abordagem otimista para a modificação de dados adquirindo bloqueios nos dados antes de realizar a modificação apenas para impor restrições. Caso contrário, os bloqueios não são adquiridos nos dados até que os dados sejam modificados. Quando uma linha de dados atende aos critérios de atualização, a transação de instantâneo verifica se a linha de dados não foi modificada por uma transação simultânea confirmada após o início da transação de instantâneo. Se a linha de dados tiver sido modificada fora da transação de instantâneo, ocorrerá um conflito de atualizaçãoe a transação de instantâneo é encerrada. O conflito de atualização é tratado pelo Mecanismo de Banco de Dados do SQL Server e não há como desabilitar a detecção de conflito de atualização.

    Este parágrafo acima e especialmente a parte em que os bloqueios são de fato adquiridos pouco antes de os dados serem modificados explicam o comportamento de bloqueio (escritores para escritores) (e considerando a nota "Importante" mencionada no topo):

    Então sob SNAPSHOTisolamento:

    • Digamos que a transação A leia vários dados. Nenhum bloqueio é adquirido.
    • Outras transações podem ler os mesmos dados e nenhum bloqueio é adquirido.
    • Quando a transação A tenta modificar alguns dados, um bloqueio é adquirido e mantido até o final da transação, que pode ser commit ou rollback.
    • Outras transações ainda podem ler os dados (é claro que eles veem alguma versão anterior). Sem travamento.
    • Se a transação B, no entanto, tentar modificar os dados já mantidos por algum bloqueio (da transação A não confirmada), ela tentará colocar algum bloqueio também, e B será bloqueado.
    • Se a transação A for confirmada em algum ponto, seus bloqueios serão liberados, então a transação B será desbloqueada. No entanto, B agora verá um conflito de atualização e não poderá ter êxito.
    • Se a transação A for revertida, seus bloqueios serão liberados e suas versões de linha removidas, de modo que a transação B será desbloqueada e suas modificações poderão prosseguir.
    • 5

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