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.

Foi útil?

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.

Desempenho Dahsboard link

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top