Quartz.Net - Блокировка - PullRequest
       51

Quartz.Net - Блокировка

2 голосов
/ 28 июля 2011

Я работаю над планировщиком, который каждые 30 секунд проверяет базу данных на наличие изменений в таблице опроса. Таблица опроса содержит поля, такие как Имя, Когда (для простоты).

Вот шаг за шагом, что я делаю - я на самом деле использую Кварцевое задание, которое запускается каждые 30 секунд, чтобы добавить больше заданий.

  • Загрузить все опросы, которые были изменены после даты / времени последнего извлечения
  • Просматривайте их и добавляйте новые или обновляйте существующие задания / триггеры

Программа работает нормально при первом запуске, получает все опросы и т. Д.

Однако, если я иду в опрос и что-то меняю, моя программа получает изменения, но выдает исключение

Quartz.JobPersistenceException: Couldn't acquire next trigger: Couldn't retrieve trigger: Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.

Не уверен, почему это может происходить. Любые предложения приветствуются, сейчас я провожу несколько часов, пытаясь найти его.

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

Я считаю, что это известная проблема с Quartz.Net при использовании ADO Job Store. Есть некоторые предложения, которые, по-видимому, смягчают проблему, например, использование UpdateLockRowSemaphore с SQLServer или перемещение вашего adojobstore в отдельную базу данных.

Вот темы из списка рассылки групп Google, в которых обсуждается эта проблема.

0 голосов
/ 28 июля 2011

Похоже, что это исключение SQL, Quartz просто передает его в стек. Попробуйте выбрать данные с помощью опции NOLOCK:

select dbo.Table.Column
from dbo.Table with(NOLOCK)
where dbo.Table.OtherColumn = @Param;

Google для получения дополнительной информации о NOLOCK. Скорее всего, вам нужно изменить схему базы данных или использовать NOLOCK (не обязательно плохо).

...