Quartz.Net - 死锁

时间:2011-07-27 23:33:00

标签: c# scheduling deadlock quartz.net

我正在研究一个调度程序,它会检查每30秒数据库中的调查表中的任何更改。调查表包含Name,WhenDue(为简单起见)等字段。

以下是我一步一步做的事情 - 实际上我使用Quartz Job设置为每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 :(得分:0)

看起来这是一个SQL异常,Quartz只是将它传递给堆栈。尝试使用NOLOCK选项选择数据:

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

Google了解有关NOLOCK的更多信息。您很可能需要重新设计数据库架构或使用NOLOCK(不一定是坏事)。

答案 1 :(得分:0)

我相信当您使用ADO Job Store时,这是Quartz.Net的一个已知问题。有一些建议似乎可以缓解这个问题,例如将UpdateLockRowSemaphore与SQLServer一起使用或将adojobstore移动到单独的数据库。

以下是Google群组邮件列表中讨论此问题的threads

相关问题