0

我在 asp.net webforms 中编写了 Web 应用程序,在那里我为用户提供了任务池,但我遇到了一些难题。当用户选择某个任务时,另一个用户应该不能选择相同的任务。

我的实际想法是将日期为“Period”的列添加到带有任务的表(sql server)中,当用户处理它时,它会更新,并且列“busy”。在后台会运行一些线程,每个线程都会更新这个日期。5分钟和一次将“忙碌”设置为1。(当用户打开带有任务的站点时开始)

在数据库中,我将有一份工作将开始每个前任。7 分钟,如果“期间”中的日期时间早于 5 分钟,则将“忙碌”列设置为 0,然后任务将返回池中。

因此,当用户完成任务时,工作会在一段时间后将其推回池中。当然,用户可以单击某个按钮并将忙 o 设置为 0。我想实现该任务在有人工作时不可用。我不知道这是否是好的方法。Mayby somene 对这种情况有任何经验。

4

2 回答 2

0

我认为这不是一个好方法。

您正在执行的任务基本上是实现功能的工作,如果您将其交付给客户,这是一个很大的问题。

我建议你使用锁定表。检查这个 http://msdn.microsoft.com/en-us/library/aa213026(v=sql.80).aspx

此外,如果您在代码中使用数据库,强烈建议使用事务。

于 2012-12-27T11:02:05.217 回答
0

这根本不是一个好方法。

首先,您正在为简单的事情创建一个过于复杂的解决方案。

您从定义任务的状态开始......例如:

  • 待办的
  • 忙(当用户打开并开始处理它时)
  • 完成的

当用户打开任务时,您只需将任务直接更新为忙碌即可。当您调用 Update 语句时,数据库将只忍受一个客户端更改表的状态。

然后你得到行数,如果它是 1,那么你现在拥有任务的所有权,只有在这种情况下你返回任务信息,否则,只会引发错误。

您需要在 ASP.NET 中处理此错误。

例如:

UPDATE MY_TASKS SET STATUS = 'Busy' WHEN TASK_ID = 'some-id' AND TASK_STATUS <> 'Busy'

IF @@ROWCOUNT = 1
BEGIN
    SELECT * FROM MY_TASKS WHERE TASK_ID = 'some-id'

END
ELSE
BEGIN
    RAISERROR('Another user is working on this task', 16, 1) 
END

您可以根据需要装饰此代码,设置最大周期,创建更多状态,控制状态之间的转换,就像在有限状态机中一样......但请不要试图用原子弹杀死苍蝇。

于 2012-12-27T11:19:21.560 回答