Artigo: 832524 - Última revisão: quarta-feira, 25 de Abril de 2007 - Revisão: 1.6

Boletim técnico do SQL Server - como resolver um impasse

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página


Expandir tudo | Reduzir tudo

Boletim técnico do SQL Server

Tópico abrangido neste número: como resolver um impasse

Objectivo

Para identificar, para resolução de problemas e recomenda uma solução para resolver um impasse.

Introdução

Este artigo examina uma situação de impasse e fornece passos para resolver o bloqueio. Cada impasse pode ser diferente e pode ser causado por diversas variáveis de ambiente diferente. As informações fornecidas neste artigo podem ajudá-lo identificar e resolver um impasse.

Caso prático

Caso prático, examine um sistema 911 seis operadores. Durante a actividade de pico aplicação front-end do Microsoft Visual Basic que estão a utilizar tem ligações interrompidas. Devido a ligações interrompidas, os operadores têm re-input dados. Para um sistema 911 funciona 24 horas por dia, sete dias por semana, este comportamento é inaceitável.

O que é um impasse?

Um impasse ocorre quando dois sistema servidor ID do processo (SPID) estão a aguardar um recurso e nenhum processo pode avançar uma vez que o processo está a impedir-obter o recurso.

Thread ?s Gestor bloqueio verifica bloqueios. Quando o algoritmo de detecção de impasse ?s gestora de bloqueio detecta um impasse, o Gestor de bloqueio escolhe um os SPID como vítima. O Gestor de bloqueio inicia uma mensagem de erro 1205 que é enviada para o cliente e o Gestor de bloqueio destrói o SPID. Matar o SPID liberta os recursos e permite que outros SPID continuar. O SPID é vítima de impasse a matar é o que faz com que a ligação quebrada que a aplicação front-end Basic Visual experiências.

Numa aplicação bem concebida, a aplicação front-end deve traps para o erro 1205, restabelecer a ligação do SQL Server e, em seguida, voltar a submeter a transacção.

Apesar de podem ser minimizados impasses, não podem ser completamente evitados. É motivos pelos quais a aplicação front-end deverá ser concebida para processar bloqueios.

Como identificar um impasse

passo 1

Para identificar um impasse, primeiro tem de obter informações de registo. Se suspeitar que um impasse, deve reunir informações sobre (SPID) e os recursos envolvidos de impasse. Para tal, adicione-T1204 e -parâmetros de arranque T3605 ao SQL Server. Para adicionar estes dois parâmetros de arranque, siga estes passos:
  • Inicie o SQL Server Enterprise Manager.
  • Seleccione e, em seguida, clique com o botão direito do rato o servidor.
  • Clique em Propriedades .
  • Clique em parâmetros de inicialização .
  • Na caixa de diálogo Parâmetros de inicialização , escreva -T1204 no texto parâmetros e, em seguida, clique em Adicionar .
  • Na caixa de texto parâmetros , escreva -T3605 e, em seguida, clique em Adicionar .
  • Clique em OK .

Os parâmetros de arranque tem efeito quando for parado e reiniciado em seguida, SQL Server.

-T1204 arranque parâmetro recolhe informações sobre o processo e os recursos quando o algoritmo de detecção de impasse encontra um impasse. -T3605 parâmetro de arranque escreve estas informações para os registos de erro do SQL Server.

-T1205 arranque recolhe informações de parâmetros sempre que o algoritmo de impasse verifica para um impasse, não quando é detectado um impasse. Não é necessário utilizar o parâmetro de arranque-T1205.

Se utilizar o - parâmetro de arranque T1205, o seguinte é um exemplo de resultado será o registo de erros do SQL Server:

2003-05-14 11:46:26.76 spid4     Starting deadlock search 1
2003-05-14 11:46:26.76 spid4     Target Resource Owner:
2003-05-14 11:46:26.76 spid4      ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4      Node:1       ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4     
2003-05-14 11:46:26.76 spid4     End deadlock search 1 ... a deadlock was not found.
2003-05-14 11:46:26.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     Starting deadlock search 2


Por vezes, não poderá parar e reiniciar o SQL Server. Nesse caso, pode utilizar o analisador de consultas para executar o seguinte comando para activar os sinalizadores de rastreio de impasse.

Nota Desta forma pode reunir informações sobre os bloqueios imediatamente. O-"1" indica todos os SPID.

dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

passo 2

Em seguida, tem de recolher um rastreamento SQL Profiler. Se activar o sinalizador de rastreio de impasse, obterá maior das informações necessárias, mas nem sempre. Por exemplo, no caso prático a saída de sinalizador de rastreio identificado que um sistema sp_cursoropen procedimento armazenado e um "UPDATE tblQueuedEvents definir notifyid = 3, ResynchDate" instrução foram envolvido um impasse. Infelizmente, não sabem a definição do procedimento armazenado do sistema sp_cursoropen . Também não tem a instrução UPDATE completa porque foi truncado.

SQL Profiler pode obter as instruções completas juntamente com os planos de execução das instruções. Um rastreamento SQL Profiler também tem um evento de bloqueio para "impasse" e "cadeia de impasse". "Impasse" corresponde ao-sinalizador T1204 e "cadeia de impasse" corresponde ao-sinalizador T1205. Activar os sinalizadores de rastreio de impasse e executar um rastreio de SQL Profiler durante a ocorrência de um impasse devem fornecem os dados que necessita para resolver um impasse. Neste caso e noutros, executar o SQL Profiler altera o tempo de execução suficiente para evitar o bloqueio. Assim, que normalmente irá capturar as informações de impasse com os sinalizadores de rastreio e, em seguida, executar o SQL Profiler.

Resolução de problemas um impasse

Depois de ocorre um impasse, pode reunir informações sobre o bloqueio, utilizando o utilitário sqldiag e utilizando o SQL Profiler. Na saída do ficheiro SQLDiag.txt, procure uma entrada de "Espera para gráfico". A "aguardar - gráfico" entrada indica que foi detectado um impasse.

O seguinte é um exemplo do resultado poderá ser apresentada no registo de erros do SQL Server quando utiliza o - parâmetro de arranque T1205.

2003-05-05 15:11:50.80 spid4    Wait-for graph
2003-05-05 15:11:50.80 spid4    Node:1
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Victim Resource Owner:
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: X SPID:60 ECID:0 Ec:(0x1F1BB5B0) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: RPC Event: sp_cursoropen;1
2003-05-05 15:11:50.80 spid4    SPID: 55 ECID: 0 Statement Type: EXECUTE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1937f2a0 Mode: S        Flg:0x0 Ref:1 Life:00000000 SPID:55 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:2 (da00ce043a9e) CleanCnt:1 Mode: U Fl ags: 0x0
 
2003-05-05 15:11:50.80 spid4    Node:2
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: Language Event: Update tblQueuedEvents Set NotifyID = 2, ResynchDate
2003-05-05 15:11:50.80 spid4    SPID: 60 ECID: 0 Statement Type: UPDATE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1936e420 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:60 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:1 (2d018af70d80) CleanCnt:1 Mode: X Flags: 0x0


Na entrada "Aguardar para gráfico", tiver o nó 1 e nó 2. Em cada nó, terá uma secção de concessão e uma secção de pedido. A secção de concessão é "Lista de conceder" e a secção de pedido é o "pedido por."
Em cada nó, pode identificar o seguinte:
  • O SPID.
  • O comando o SPID foi executada.
  • O recurso.
  • O modo de bloqueio no recurso.

Por exemplo, no nó 1, a lista de conceder SPID 55 tinha sido concedido um bloqueio de actualização, modo de: U no recurso KEY: 8:1653632984:2. 8 = DBID, 1653632984 = IDObjecto e 2 = Indid. Para obter o número de identificação de base de dados, execute o procedimento sp_helpdb armazenados. Para obter a tabela, execute o seguinte código:
select * from sysobjects where id = 1653632984


Para obter o índice, execute o seguinte código:
select * from sysindexes where indid = 2 and id = 1653632984

Se for igual a 2 IndexId, sabe que o índice é um índice agrupado. O comando 55 SPID foi executado era o procedimento sp_cursoropen armazenados.

No nó 2, a lista de conceder 60 SPID foi concedido um bloqueio exclusivo, modo: X, num recurso KEY: 8:1653632984:1. 8 = DBID, 1653632984 = IDObjecto, 1 = Indid. Trata-se na mesma tabela mas índice 1 é o índice clusterizado. O comando 60 SPID foi executar foi:
Update tblQueuedEvents Set NotifyID = 2, ResynchDate

Um IndexId é igual a 1 é um índice agrupado.

Um IndexId é igual a 2 é um índice agrupado.

Nota Bloqueios são sensíveis ao muito tempo.

Em seguida, no nó 1, pedido por SPID 55 pedido um bloqueio partilhado, modo: S, IndexId = 1. No nó 2, Pedido por, SPID 60 pediu um bloqueio exclusivo, modo: X no IndexId = 2. Uma vez que ocorrerem estes pedidos de bloqueio ao mesmo tempo, ocorre o bloqueio. Cada SPID concedido bloqueios estão a impedir os bloqueios pedidos continuar.

A tabela seguinte mostra o gráfico de compatibilidade de bloqueio. Para obter mais informações sobre compatibilidade de bloqueio, consulte o tópico "Bloquear compatibilidade" no SQL Server 2000 Books Online.

gráfico de compatibilidade de bloqueio
Reduzir esta tabelaExpandir esta tabela
modo de pedido ÉSUIXSEISX
Tipo de composição partilhados (IS)SimSimSimSimSimNão
Partilhado (S)SimSimSimNãoNãoNão
Actualização (U) SimSimNãoNãoNãoNão
Tipo exclusivo (IX)SimNãoNãoSimNãoNão
Partilhada com intenção exclusiva (SIX) SimNãoNãoNãoNãoNão
Exclusivo (X)NãoNãoNãoNãoNãoNão


Em seguida, observando a saída, identificar o ID de objecto 1653632984 como tabela tblQueuedEvents e obter um procedimento sp_help armazenadas de saída para a tabela. Existem dois índices na tabela. Os dois índices foram ix_tblQueuedEvents e PK_tblQueuedEvent . ix_tblQueuedEvents é um índice clusterizado no ResynchDate e PK_tblQueuedEvent é uma chave primária, índice agrupado exclusivo no EventSID.

O rastreio de SQL Profiler não foi possível capturar a ocorrência de impasse. Não se esqueça, bloqueios dependente muito tempo. A sobrecarga de SQL Profiler provavelmente adicionado algum tempo para a execução de um dos processos e que impediu que o SQL Profiler obter numa situação de impasse. No entanto, fornecem informações que pode utilizar para resolver o problema. Encontrada a instrução de tblQueuedEvents actualização completa para ser semelhante à seguinte:

Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16' where eventSID = 73023
Também encontrar o plano de execução. Ainda não tiver a declaração de procedimento completo sp_cursoropen armazenados mas tem informações suficientes para recomendar uma solução que resolverá o bloqueio.

Segue-se o plano de execução.

Nota Este plano de execução específico é lido da direita para esquerda e inferior para cima.

StmtText                                                      
				                                                                           
				   
				                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
				
Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16'
				where eventSID = 73023                                                     
				   
				                    
|--Clustered Index
				Update(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[ix_tblQueuedEvents ]),
				SET:([tblQueuedEvents].[NotifyID]=[@1],
				[tblQueuedEvents].[ResynchDate]=[Expr1004]))  
     |--Top(1)                                                                 
				                                                                           
				   
				               
           |--Compute Scalar(DEFINE:([Expr1004]=Convert([@2])))                
				                                                                           
				   
				                
                 |--Index
				Seek(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[PK_tblQueuedEvents]),
				SEEK:([tblQueuedEvents].[EventSID]=[@3]) 

Recomendamos uma solução para resolver o bloqueio

Tenha em atenção que a instrução UPDATE está a executar uma "actualização do índice clusterizado" no índice agrupado. Por este motivo, o índice agrupado e o índice clusterizado terão ambos de ser actualizados. O índice clusterizado é ix_tblQueuedEvents e o índice agrupado é PK_tblQueuedEvents . Para efectuar as actualizações, a instrução UPDATE tem de obter bloqueios exclusivos em ambos os índices. Estes dois índices são índices envolvidos de impasse. De rever o SQL Profiler rastreios, não verá quaisquer consultas que utilizados o ResynchDate na cláusula WHERE. Todas as afirmações eram muito específicas e utilizaram a EventSID na cláusula WHERE. Uma melhor opção de um índice agrupado seria EventSID. Com estas informações e um debate com o cliente, é detectou que o índice ResynchDate foi antigo, e não foi necessária. Recomendamos que o cliente largar o índice ix_tblQueuedEvents no ResynchDate e que podem efectuarem PK_tblQueuedEvent um índice agrupado. Isto resolver a situação de impasse.

Isto é apenas um exemplo de um incidente de impasse envolve bloqueios. Bloqueios também podem envolver parallelism e envolver threads. Podem envolver um, dois, três, ou mais SPID e recursos. Com as maiúsculas e minúsculas impasse, terá de obter a saída de parâmetro de arranque de ?T1204 e o rastreio de SQL Profiler para identificar, para resolução de problemas e para resolver o bloqueio. A situação de impasse envolvem a processos diferentes e recursos. Por conseguinte, soluções variam de caso a caso. Pode utilizar para resolver impasses métodos normais incluem:
  • Adicionar e largando índices.
  • Adicionar sugestões de índice.
  • Modificar a aplicação para aceder a recursos num padrão semelhante.
  • Remover a actividade da transacção como accionadores. Por predefinição, os accionadores são transaccionais.
  • Manter transacções como curtas possível.

Leitura adicional

Para obter mais informações sobre bloqueios, visite os seguintes Web sites da Microsoft:

http://msdn2.microsoft.com/en-us/library/Aa213040 (http://msdn2.microsoft.com/en-us/library/Aa213040)

http://msdn2.microsoft.com/en-us/library/aa213042(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213042(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa213028(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213028(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa937573(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa937573(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa213041(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213041(SQL.80).aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 832524  (http://support.microsoft.com/kb/832524/en-us/ )