我正在研究一个调度程序,它会检查每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.
这不确定为什么会发生这种情况。欢迎任何建议,我现在花几个小时试图追踪它。
答案 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。