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 / 244054
Accepted
Forrest
Forrest
Asked: 2019-07-30 08:20:41 +0800 CST2019-07-30 08:20:41 +0800 CST 2019-07-30 08:20:41 +0800 CST

Por que esse bloqueio RX-X não aparece em Extended Events?

  • 772

O problema

Eu tenho um par de consultas que, sob isolamento serializável, causam um bloqueio RX-X. No entanto, quando uso Extended Events para assistir a aquisição de bloqueio, a aquisição de bloqueio RX-X nunca aparece, apenas é liberada. De onde isso vem?

A reprodução

Segue minha tabela:

CREATE TABLE dbo.LockTest (
ID int identity,
Junk char(4)
)

CREATE CLUSTERED INDEX CX_LockTest --not unique!
ON dbo.LockTest(ID)

--preload some rows
INSERT dbo.LockTest
VALUES ('data'),('data'),('data')

Aqui está o meu lote de problemas:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

INSERT dbo.LockTest
VALUES ('bleh')

SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()

--ROLLBACK

Eu verifico os bloqueios mantidos por esta sessão e vejo RX-X:

SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!

dm_tran_locks

Mas também tenho um Evento Estendido em lock_acquirede lock_released. Eu o filtro no associado_object_id apropriado... não há RX-X.

Saída de evento estendida

Após executar o rollback, vejo o RX-X (LAST_MODE) liberado, mesmo que nunca tenha sido adquirido.

LAST_MODE

O que eu tentei

  • Olhei para todos os bloqueios em Eventos Estendidos - sem filtragem. Nenhum bloqueio RX-X adquirido.

  • Eu também tentei Profiler: mesmos resultados (exceto, é claro, que obtém o nome certo ... sem "LAST_MODE").

  • Eu executei o XE para escalonamentos de bloqueio - não está lá.

  • Não há XE especificamente para conversões, mas pude confirmar que pelo menos a conversão de bloqueio de U para X é capturada porlock_acquired

Também digno de nota é o RI-N que é adquirido, mas nunca lançado. Minha hipótese atual é que o RX-X é um bloqueio de conversão, conforme descrito aqui . Há bloqueios de intervalo de chaves sobrepostos no meu lote que parecem se qualificar para conversão, mas o bloqueio RX-X não está na tabela de conversão.

De onde vem esse bloqueio e por que não é captado pelos Eventos Estendidos?

sql-server locking
  • 1 1 respostas
  • 395 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2019-07-30T17:11:17+08:002019-07-30T17:11:17+08:00

    A inserção de linha única adquire um Xbloqueio (exclusivo) na nova linha.

    As SELECTtentativas de adquirir um bloqueio de chave compartilhada ( RangeS-S) compartilhado por intervalo.

    Essa solicitação é relatada pelo lock_acquiredExtended Event como mode = RS_S.

    É relatado pela classe de eventos Profiler Lock:Acquiredcomo modo 13 ( LCK_M_RS_S).

    O modo solicitado é combinado com o modo de bloqueio exclusivoLock::CalculateGrantMode existente em sqlmin.dll. Não há modo combinado de intervalo compartilhado, exclusivo de chave ( RangeS-X), portanto, o resultado do cálculo é exclusivo de intervalo, exclusivo de chave ( RangeX-X), que é o modo 15.

    O cálculo do modo de concessão acima é executado antes que o evento estendido seja gerado pelo lck_ProduceExtendedEvent<XeSqlPkg::lock_acquired>. No entanto, tanto o Profiler quanto o Extended Events registram o modo solicitado RangeS-S , não o modo de bloqueio resultante RangeX-X. Isso é contrário à documentação limitada , que diz:

    Modo | int | Modo resultante após a aquisição do bloqueio.

    A coluna de modo do evento estendido não possui documentação e a descrição nos metadados está em branco. Talvez a própria Microsoft nem tivesse certeza do comportamento.

    Muitas vezes pensei que seria mais útil se os eventos de bloqueio relatassem os modos solicitado e resultante , mas não é isso que temos. O arranjo atual torna praticamente impossível rastrear e combinar a aquisição e liberação de bloqueio.

    Pode haver uma boa razão para relatar bloqueios dessa maneira. Se não atender às suas necessidades, você pode abrir um caso de suporte com a Microsoft ou criar um item de Feedback do Azure.


    LAST_MODE

    O misterioso LAST_MODEé algo que Erik Darling comentou antes . É o map_keyvalor mais alto na lista de modos de bloqueio expostos por sys.dm_xe_map_values:

    SELECT
        DXMV.map_key,
        DXMV.map_value
    FROM sys.dm_xe_map_values AS DXMV
    WHERE 
        DXMV.[name] = N'lock_mode'
    ORDER BY
        DXMV.map_key;
    
    ╔═════════╦═══════════╗
    ║ map_key ║ map_value ║
    ╠═════════╬═══════════╣
    ║       0 ║ NL        ║
    ║       1 ║ SCH_S     ║
    ║       2 ║ SCH_M     ║
    ║       3 ║ S         ║
    ║       4 ║ U         ║
    ║       5 ║ X         ║
    ║       6 ║ IS        ║
    ║       7 ║ IU        ║
    ║       8 ║ IX        ║
    ║       9 ║ SIU       ║
    ║      10 ║ SIX       ║
    ║      11 ║ UIX       ║
    ║      12 ║ BU        ║
    ║      13 ║ RS_S      ║
    ║      14 ║ RS_U      ║
    ║      15 ║ RI_NL     ║
    ║      16 ║ RI_S      ║
    ║      17 ║ RI_U      ║
    ║      18 ║ RI_X      ║
    ║      19 ║ RX_S      ║
    ║      20 ║ RX_U      ║
    ║      21 ║ LAST_MODE ║
    ╚═════════╩═══════════╝
    

    A estrutura de memória acessada via DMV (usando sqlmin!CMapValuesTable) é armazenada a partir do endereço sqlmin!XeSqlPkg::g_lock_mode. Cada entrada de 16 bytes na estrutura contém o map_keye um ponteiro para a string retornada map_valuepelo streaming TVF.

    As strings são armazenadas exatamente como mostrado na tabela acima (embora não nessa ordem). Parece ser um erro que a entrada 21 tenha um map_value"LAST_MODE" em vez do esperado "RX_X". Erik Darling relatou o problema no Azure Feedback .

    • 12

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