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 / 320565
Accepted
Dominique
Dominique
Asked: 2022-12-06 02:53:39 +0800 CST2022-12-06 02:53:39 +0800 CST 2022-12-06 02:53:39 +0800 CST

Quais dois threads estão lidando com qual tabela e como resolver isso?

  • 772

Estou trabalhando em um aplicativo multithread (VB.Net/C#), que está trabalhando em um banco de dados SQL-server.
Regularmente, meu cliente reclama que o aplicativo mostra exceções do tipo "impasse" sobre o chamado SQLClient e, ao reiniciar o aplicativo, tudo funciona bem novamente (por um tempo).

Pela descrição, não acredito que meu cliente esteja enfrentando um impasse real (um thread aguardando outro thread), mas acredito que estou lidando com duas solicitações de banco de dados, provavelmente na mesma tabela, onde uma transação leva tanto vez que bloqueia a outra transação, mas isso é apenas um palpite, e gostaria de ter certeza disso. Para isso, estou pensando em perguntar ao banco de dados quais threads estão acessando qual(is) tabela(s), espero que isso me dê algumas informações.

Pesquisando no site aqui, descobri a dm_db_index_operational_statstabela, mencionada nesta outra pergunta , mas sendo um novato, isso parece bastante complicado, portanto, gostaria de fazer isso como uma pergunta simples:

Como posso saber quais threads de qual aplicativo estão acessando quais tabelas no meu banco de dados SQL-server? Obviamente, quanto mais informações (ID do processo, ID do thread, nome do thread, (parte superior da) pilha de chamadas, ...) melhor.

Isso existe?

No que diz respeito a uma possível solução:
Meu aplicativo é baseado nesta DLL:

"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll" 

... faz o seguinte para acessar o banco de dados (por exemplo, para remover entradas obsoletas):

Public Shared Sub ExecuteSQL(ByVal sSQL As String, ByVal ParamArray dbParams() As SqlParameter)
    Dim oCommand As SqlCommand = Nothing
    Try
        oCommand = BuildCommand(sSQL, dbParams)
        oCommand.CommandTimeout = 60
        oCommand.ExecuteNonQuery()
    Catch ex As Exception
        Debug.WriteLine(ex.Message)
        Throw
    Finally
        If oCommand IsNot Nothing Then ReleaseConnection(oCommand.Connection)
    End Try
End Sub

Gostaria de adicionar um mecanismo de bloqueio para evitar este tipo de problemas, algo como:

DatabaseConnection.Lock_Table("Table_which_is_handled");
ExecuteSQL(...); // working on "Table_which_is_handled"
DatabaseConnection.Release_Lock_Table("Table_which_is_handled");

Isso existe?

Alguém tem uma ideia?
desde já, obrigado

Editar após discussão com Dan Huzman :
Esta resposta , referida por Dan Huzman , menciona a seguinte consulta SQL:

--Get xml_deadlock_report events from system_health session file target
WITH
  --get trace folder path and append session name with wildcard (assumes base file name is same as session name)
  all_trace_files AS (
    SELECT path + '\system_health*.xel' AS FileNamePattern
    FROM sys.dm_os_server_diagnostics_log_configurations
    )
  --get xml_deadlock_report events from all system_health trace files
, deadlock_reports AS (
    SELECT CAST(event_data AS xml) AS deadlock_report_xml
    FROM all_trace_files
    CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS trace_records
    WHERE trace_records.object_name like 'xml_deadlock_report'
)
SELECT TOP 10
  deadlock_report_xml.value('(/event/@timestamp)[1]', 'datetime2') AS UtcTimestamp
, deadlock_report_xml AS DeadlockReportXml
FROM deadlock_reports;

Isso se refere a alguns arquivos, localizados no computador do cliente, provavelmente no diretório "C:\Arquivos de Programas\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Log" (para ter certeza, verifique ) SELECT path FROM sys.dm_os_server_diagnostics_log_configurations.
Posso recuperar os arquivos "system_health*.xel" mencionados e colocá-los no meu computador local (digamos, no diretório "C:\Temp_Folder") e, em seguida, iniciar a seguinte nova consulta:

--Get xml_deadlock_report events from system_health session file target
WITH
  --get trace folder path and append session name with wildcard (assumes base file name is same as session name)
  all_trace_files AS (
    SELECT 'C:\Temp_Folder\system_health*.xel' AS FileNamePattern
    FROM sys.dm_os_server_diagnostics_log_configurations
    )
  --get xml_deadlock_report events from all system_health trace files
, deadlock_reports AS (
    SELECT CAST(event_data AS xml) AS deadlock_report_xml
    FROM all_trace_files
    CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS trace_records
    WHERE trace_records.object_name like 'xml_deadlock_report'
)
SELECT deadlock_report_xml.value('(/event/@timestamp)[1]', 'datetime2') AS UtcTimestamp
, deadlock_report_xml AS DeadlockReportXml
FROM deadlock_reports;

Isso me daria as informações que estou procurando ou preciso abrir uma sessão do Microsoft SQL Server Management Studio no computador do meu cliente?

sql-server
  • 1 1 respostas
  • 35 Views

1 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2022-12-06T07:18:21+08:002022-12-06T07:18:21+08:00

    Um impasse não é apenas uma thread esperando pela outra (bloqueio), mas mais 2 threads esperando uma pela outra (conflito). Os impasses geralmente podem ser resolvidos com ajuste de consulta/índice, em vez de ir tão longe a ponto de serializar o acesso ao banco de dados.

    O xml_deadlock_reporté capturado pelo system_healthrastreamento de evento estendido e ajudará a identificar os processos e recursos envolvidos em impasses recentes. As informações de impasse podem ser obtidas com as consultas coletadas dos comentários e adicionadas à sua pergunta.

    • 2

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