我在asp.net webforms中编写了web应用程序,在那里我为用户提供了一系列任务,我有一些困境。 当用户选择某个任务时,另一个用户不应该选择相同的任务。
我的实际想法是将带有日期“Period”的列添加到带有任务的表(sql server)中,当用户处理任务时,将更新列,并且“busy”列。在backround会工作一些线程,每个更新这个日期为ex。 5分钟和一次将“忙”设置为1.(当用户打开带有任务的站点时启动)
在数据库中,我的工作将从每个ex开始。 7分钟,如果“期间”中的日期时间早于5分钟,则将列设置为“忙”为0,然后任务将返回池中。
因此,当用户完成任务时,工作会在一段时间后将其推回池中。当然,用户可以单击某个按钮并将busy o设置为0.我希望实现该任务在某人工作时不可用。我不知道这是不是好事。 Mayby somene对这种情况有任何经验。
答案 0 :(得分:0)
我认为这不是一个好方法。
您正在执行的任务基本上是实现功能的工作,如果您将此功能提供给客户端,那么它就是一个很大的NO。
我建议你使用桌子锁定。 检查一下 http://msdn.microsoft.com/en-us/library/aa213026(v=sql.80).aspx
此外,如果您正在使用代码中的数据库,强烈建议您使用事务。
答案 1 :(得分: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
您可以根据需要装饰此代码,设置最长时间,创建更多状态,控制状态之间的转换,例如在有限状态机中......但请不要尝试使用原子弹杀死苍蝇。