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 / 137728
Accepted
Michael Green
Michael Green
Asked: 2016-05-06 21:41:10 +0800 CST2016-05-06 21:41:10 +0800 CST 2016-05-06 21:41:10 +0800 CST

Durante a reversão, a escalação de bloqueio é revertida

  • 772

Geralmente, o SQL Server aceita bloqueios durante as atualizações. Ele também oferece suporte ao escalonamento de bloqueio :

Escalação de bloqueio é o processo de conversão de muitos bloqueios de granularidade em menos bloqueios de granularidade, reduzindo a sobrecarga do sistema enquanto aumenta a probabilidade de contenção de simultaneidade.

Durante um ROLLBACK de transação, o SQL Server reduz os bloqueios, colocando de volta os bloqueios refinados?

sql-server sql-server-2008-r2
  • 1 1 respostas
  • 1028 Views

1 respostas

  • Voted
  1. Best Answer
    Michael Green
    2016-05-06T21:41:10+08:002016-05-06T21:41:10+08:00

    O SQL Server não reduz o bloqueio.

    Eu investiguei usando uma tabela " Numbers " com 100.000 linhas. Empiricamente, a atualização de 5.000 linhas produziu um número correspondente de bloqueios RID em sys.dm_tran_locks. A atualização de mais 10.000 linhas causou o escalonamento para um único bloqueio de tabela. Isso foi consistentemente reproduzível. Para minimizar os objetos envolvidos a tabela era um heap sem índices.

    Usei o rastreamento de evento estendido para capturar lock_acquirede lock_releasedeventos. Para facilitar a análise, usei traços separados durante as fases UPDATE e ROLLBACK.

    Duas sessões (janelas do SSMS) foram usadas - uma para as instruções DML e outra para o rastreamento DDL. Não pude usar uma única sessão, pois queria parar e iniciar rastreamentos enquanto a transação está aberta e isso não é permitido. O nível de isolamento é READCOMITTED.

    O resultado de select @@VERSIONé

    Microsoft SQL Server 2008 R2 (SP2) - 10.50.4042.0 (Intel X86) 26 de março de 2015 21:49:16 Copyright (c) Microsoft Corporation Enterprise Edition no Windows NT 6.1 (Build 7601: Service Pack 1)

    Os passos dados foram

    1. Crie e inicie o rastreamento Acquire.

      CREATE EVENT SESSION DuringUpdate
      ON SERVER
      ADD EVENT sqlserver.lock_acquired,
      ADD EVENT sqlserver.lock_released
      ADD TARGET package0.asynchronous_file_target
          (SET filename = 'c:\temp\LockRollback\DuringUpdate.xel',
           metadatafile = 'c:\temp\LockRollback\DuringUpdate.xem')
      WITH(EVENT_RETENTION_MODE = NO_EVENT_LOSS,
           MAX_DISPATCH_LATENCY = 1 SECONDS
          );
      
      
      ALTER EVENT SESSION DuringUpdate
      ON SERVER
      STATE = start;
      
    2. Comece uma transação e atualize 5.000 linhas.

      begin transaction;
      
      update dbo.Numbers
      set Number = Number
      where Number between 1 and 5000;
      
    3. Atualize mais 10.000 linhas.

      update dbo.Numbers
      set Number = Number
      where Number between 5001 and 15000;
      
    4. Pare o rastreamento de aquisição.

      ALTER EVENT SESSION DuringUpdate
      ON SERVER
      STATE = stop;
      
    5. Verifique se há bloqueios consultando sys.dm_tran_locks(2 - DB, tabela).

    6. Crie e inicie o rastreamento de liberação.

      CREATE EVENT SESSION DuringRollback
      ON SERVER
      ADD EVENT sqlserver.lock_acquired,
      ADD EVENT sqlserver.lock_released
      ADD TARGET package0.asynchronous_file_target
          (SET filename = 'c:\temp\LockRollback\DuringRollback.xel', 
               metadatafile = 'c:\temp\LockRollback\DuringRollback.xem')
      WITH(EVENT_RETENTION_MODE = NO_EVENT_LOSS,
           MAX_DISPATCH_LATENCY = 1 SECONDS
          );
      
      
      ALTER EVENT SESSION DuringRollback
      ON SERVER
      STATE = start;
      
    7. Reverter a transação.

      rollback;
      
    8. Pare o rastreamento de liberação.

      ALTER EVENT SESSION DuringRollback
      ON SERVER
      STATE = stop;
      
    9. Arrumar

      DROP EVENT SESSION DuringUpdate
      ON SERVER;
      
      DROP EVENT SESSION DuringRollback
      ON SERVER;
      

    Se ocorresse o desescalonamento de bloqueio, eu esperaria uma simetria completa nos dois arquivos de rastreamento - cada bloqueio adquirido durante UPDATE e o escalonamento teria uma liberação correspondente durante ROLLBACK. O que observei:

    SELECT 
        COUNT(*) as DuringUpdate
    FROM sys.fn_xe_file_target_read_file(
        'c:\temp\LockRollback\DuringUpdate*.xel', 
        'c:\temp\LockRollback\DuringUpdate*.xem', null, null);
    
    SELECT 
        COUNT(*) as DuringRollback
    FROM sys.fn_xe_file_target_read_file(
        'c:\temp\LockRollback\DuringRollback*.xel', 
        'c:\temp\LockRollback\DuringRollback*.xem', null, null);
    

    foi de 383.889 linhas e 166 linhas, respectivamente. Examinando o XML do evento para o arquivo de rollback, há apenas um evento relacionado a RIDs, PAGEs ou OBJECTS - a liberação de um bloqueio X na tabela. Concluo com isso que os bloqueios não foram desescalados durante a reversão.

    Isso ecoa a documentação para reverter para um ponto de salvamento nomeado:

    Uma instrução ROLLBACK TRANSACTION especificando um savepoint_name libera quaisquer bloqueios adquiridos além do ponto de salvamento, com exceção de escalações e conversões. Esses bloqueios não são liberados e não são convertidos de volta ao modo de bloqueio anterior.

    • 11

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