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

本文关键字:处理 任务 确保 一次 程序 数据库 何确保 | 更新日期: 2023-09-27 18:22:13

给定:

  1. 我有一个数据库,里面有一张满是任务的表
  2. 我有一个处理这些任务的程序。数据库是使用NHibernate抽象的
  3. 该程序运行多次

现在,我想确保每个任务都由一个进程来处理。

这里描述了一种可能性,但我不知道如何将其传输到使用NHibernate映射到数据库的域对象。

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

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

可能的解决方案1

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

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

可能的解决方案2

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

我从未在NHibernate中使用过乐观并发,但这个解决方案似乎可以工作。不过,我不太确定某些进程是否会缺少工作,我认为当抛出该对象时,您必须重新初始化会话。

在我看来,选项1或类似的模式效果最好。