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 / 220615
Accepted
jesijesi
jesijesi
Asked: 2018-10-20 13:40:27 +0800 CST2018-10-20 13:40:27 +0800 CST 2018-10-20 13:40:27 +0800 CST

Deadlock - Devido à atualização causando o movimento da página de índice dentro de um índice

  • 772

Ainda estou solucionando o impasse mencionado nestas perguntas . Com isso, obtive ajuda para entender por que um select manteria um bloqueio compartilhado e pude testar e confirmar isso também.

Agora estou olhando para o segundo spid envolvido no impasse. Essa sessão faz uma atualização usando uma chave primária (WHERE BatchId = @BatchI , BatchId é o PK) e precisa de IX em duas páginas. Inicialmente, não consegui descobrir por que ele precisava de bloqueios em duas páginas de um índice não clusterizado quando estava apenas atualizando uma linha. Então percebi que a atualização para essa linha alteraria a localização da linha no índice não clusterizado e isso poderia ser o motivo pelo qual ela precisa de bloqueios em duas páginas.

Isso é correto?

Em segundo lugar, por favor, ajude a confirmar se meu entendimento sobre esse impasse está correto. Para simplificar, vamos supor que há apenas duas páginas nesse índice não clusterizado. Página1 e Página2. Então é isso que está acontecendo mais ou menos insira a descrição da imagem aqui

sql-server performance
  • 1 1 respostas
  • 487 Views

1 respostas

  • Voted
  1. Best Answer
    jesijesi
    2018-11-08T18:52:26+08:002018-11-08T18:52:26+08:00

    Assim, alguns testes e o impasse é de fato causado pelo movimento da página dentro do índice não clusterizado causado por uma atualização que altera a posição da linha no índice.

    insira a descrição da imagem aqui

    Portanto, inicialmente a Sessão 2 (atualização) remove o bloqueio IX na Página2 onde a linha do índice está originalmente localizada. Como a atualização alteraria o valor e, por sua vez, alteraria a posição da linha do índice dentro do índice, a sessão 2 também desejará remover outro bloqueio IX na página de destino onde a linha do índice terminará após a atualização.

    Para entender o motivo pelo qual um select deseja manter o bloqueio S, consulte esta pergunta.

    REPO

    set nocount on 
    create table deadlck ( a int , b int, c char (3), constraint PKA primary key (a))
    create index idx on deadlck(b)
    --creating a big enough table so that selects use page lock instead of row lock
    declare @a int =1
    declare @b int =57800000 
    while 1=1
    begin
    insert into deadlck select @a,@b,'111'
    if (@a%521) =520 -- to make idx index pages fit one value in each page perfectly,  not necessary, just easier to simulate the issue while testing
    set @b=@b-1
    Set @a=@a+1
    if @a=52100
    break
    end
    
    ALTER INDEX idx ON deadlck
    REBUILD WITH (FILLFACTOR = 90); -- same reason as above, i did the math with a fill factor of 90 to have the pages of idx index have one value per page and and also the pages needed to have some space so when we do the update the index entry can move to another page without have to do a page split
    
    ALTER INDEX PKA ON deadlck
    REBUILD WITH (FILLFACTOR = 90); 
    
    --session 1
    while 1=1
    begin
    begin tran
    update deadlck set b=57799999 where a=2
    rollback
    end
    
    --session 2
    while 1=1
    begin
    begin tran
    select b from deadlck with(paglock) where (b =57799999 or b=57800000)
    rollback
    end
    
    • 2

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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