none
Тупиковые блокировки RRS feed

  • Вопрос

  • Добрый день!

    Есть таблица:
    CREATE TABLE [dbo].[T_DL_REQUEST](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[BATCH_ID] [uniqueidentifier] NULL,
    	[STATUS] [varchar](50) NOT NULL,
    	[THREAD_ID] [uniqueidentifier] NULL
    )

    В ней большое количество строк, каждая из которых является заданием на выполнение. Задания сгруппированы в пакеты с помощью BATCH_ID. Есть параллельные процессы, которые "расхватывают" себе задачи пакетами.

    Делают они это так:
    UPDATE T_DL_REQUESTSET STATUS = 'IN_PROGRESS'
              , THREAD_ID = @ThreadId
    WHERE BATCH_ID = (SELECT TOP 1 BATCH_ID
                                      FROM T_DL_REQUEST
                                      WHERE STATUS = 'WAITING')
    Так вот, часто возникают тупиковые блокировки:
    Transaction (Process ID 74) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

    Как можно модифицировать запрос, чтобы избежать блокировок?
    Спасибо.
    12 августа 2013 г. 21:23

Ответы

Все ответы