阻止读取数据一段时间

时间:2012-12-19 22:07:16

标签: asp.net sql-server-2008

我在asp.net webforms中编写了web应用程序,在那里我为用户提供了一系列任务,我有一些困境。 当用户选择某个任务时,另一个用户不应该选择相同的任务。

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

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

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

2 个答案:

答案 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

您可以根据需要装饰此代码,设置最长时间,创建更多状态,控制状态之间的转换,例如在有限状态机中......但请不要尝试使用原子弹杀死苍蝇。