数据库中的任务,多个程序处理它们 - 如何确保每个程序只处理一次?

时间:2012-02-02 22:39:06

标签: c# nhibernate

假设:

  1. 我有一个包含任务表的数据库。
  2. 我有一个处理这些任务的程序。使用NHibernate抽象数据库。
  3. 该程序多次运行。
  4. 现在,我想确保每个任务都由一个进程处理。

    有一种可能性被描述为here但是我没有看到如何将它传递给使用NHibernate映射到数据库的域对象。

    所以,问题是:
    如何实现一个具有中央数据存储和多个并发进程的任务处理系统,这些进程不能通过NHibernate直接访问?

1 个答案:

答案 0 :(得分:2)

可能的解决方案1 ​​

我们要做的一件事就是创建一个集中的流程来分发工作。我们目前有一个Wcf服务,运行在InstanceContextMode.Single ...基本上是单件服务。

当工作被分配后,它将在数据库中更新它,以反映它已被分配了请求者的id或只是一个值,如果你不关心谁得到它,那就说明了它。

可能的解决方案2

您可以在存储任务的此表上使用NHibernate中的乐观并发。您需要一个列来表明它已被分配。您只能在此表中查找尚未分配的任务。如果你去更新数据库中的任务并且有人已经抓住了这个任务并更新了它,那么你将在更新时得到一个StaleObjectException。

我从未在NHibernate中使用乐观并发,但似乎该解决方案可行。我不太确定,但某些过程不会因为工作而变得饥饿,我认为在抛出该对象时你必须重新初始化你的会话。

在我看来,选项1或与该模型类似的东西效果最佳。