SQL Server 2005 Impasse Problem
-
22-07-2019 - |
Pergunta
Eu estou correndo em um problema de bloqueio ao tentar bloquear alguns registros para que nenhum processo (serviço Windows) escolhe os itens para o serviço deles, em seguida, atualizar o status e, em seguida, retornar um conjunto de registros.
Você pode por favor deixe-me saber por que estou recebendo a questão impasse quando este proc é invocado?
CREATE PROCEDURE [dbo].[sp_LoadEventsTemp]
(
@RequestKey varchar(20),
@RequestType varchar(20),
@Status varchar(20),
@ScheduledDate smalldatetime = null
)
AS
BEGIN
declare @LoadEvents table
(
id int
)
BEGIN TRANSACTION
if (@scheduledDate is null)
Begin
insert into @LoadEvents (id)
(
Select eventqueueid FROM eventqueue
WITH (HOLDLOCK, ROWLOCK)
WHERE requestkey = @RequestKey
and requesttype = @RequestType
and [status] = @Status
)
END
else
BEGIN
insert into @LoadEvents (id)
(
Select eventqueueid FROM eventqueue
WITH (HOLDLOCK, ROWLOCK)
WHERE requestkey = @RequestKey
and requesttype = @RequestType
and [status] = @Status
and (convert(smalldatetime,scheduleddate) <= @ScheduledDate)
)
END
update eventqueue set [status] = 'InProgress'
where eventqueueid in (select id from @LoadEvents)
IF @@Error 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
select * from eventqueue
where eventqueueid in (select id from @LoadEvents)
END
END
Agradecemos antecipadamente.
Solução
Deadlocks acontecer na maioria das vezes (em minha experiência) quando os recursos differnt estão trancadas dentro de transações differnt em ordens diferentes.
Imagine que 2 processos usando o recurso A e B, mas prendê-los em ordens diferentes.
- Processo 1 bloqueios de recursos A, em seguida, recurso B
- Processo de 2 fechaduras recurso B, então o recurso A
A seguir, em seguida, torna-se possível:
- Processo 1 fechaduras recurso A
- Processo de 2 fechaduras recurso B
- Processo 1 tenta bloquear o recurso B, então pára e espera como processo 2 tem
- Processo 2 tenta bloquear o recurso A, então pára e espera como Processo 1 tem
- Ambos os proceses estão esperando para o outro, Impasse
No seu caso seria preciso ver exatamente onde o SP cai devido a um impasse (a atualização eu acho?) E quaisquer outros processos que referência nessa tabela. Poderia ser um gatilho ou algo assim, que então é travada em uma tabela diferente, não a tabela que você está atualizando.
O que gostaria de fazer é usar SQL Server 2005 SAÍDA do syntaxt para evitar ter que usar a transação ...
UPDATE
eventqueue
SET
status = 'InProgress'
WHERE
requestkey = @RequestKey
AND requesttype = @RequestType
AND status = @Status
AND (convert(smalldatetime,scheduleddate) <= @ScheduledDate OR @ScheduledDate IS NULL)
OUTPUT
inserted.*
Outras dicas
Você tem um índice não agrupado definido como:
CREATE NONCLUSTERED INDEX NC_eventqueue_requestkey_requesttype_status
ON eventqueue(requestkey, requesttype, status)
INCLUDE eventqueueid
e outro sobre eventqueueid?
Entre a conversão de scheduleddate
coluna para tipo smalldatetime
impedirá o uso de um índice em que coluna.
Em primeiro lugar, como você está executando o SQL Server eu recomendo que você intall Desempenho Painel que é uma ferramenta muito útil para identificar o que bloqueios estão sendo feitos no servidor.
Em segundo lugar, tomar um traço de seu SQL Server usando SQL Profiler (já instalado) e certifique-se de que você selecione nos eventos de seleção do item Bloqueios> Impasse gráfico que irá mostrar o que está causando o impasse.
Você tem que ter muito claro em sua mente o que um impasse é começar a resolver esta questão. Quando qualquer acesso é feito a qualquer tabela ou linha na DB um bloqueio é feito.
Vamos chamar SPID 51 e SPID 52 (SPID = SQL ID do Processo)
SPID 51 fechaduras celular A
SPID 52 fechaduras celular B
Se no mesmo SPID transacção 51 pedidos para a célula B, ele vai esperar SPID 52 até que ele libera-lo.
Se no mesmo SPID transacção 52 pedidos para o celular A, você tem um impasse porque esta situação nunca vai terminar (51 de espera para 52 e 52 para 51)
Got para lhe dizer que não é fácil para solucionar problemas, mas você que você cavar mais fundo para encontrar a resolução