2011-04-19 41 views
3

我有一个ASP.NET MVC 2网站。所有buisnes都在数据库存储过程中(MS SQL SERVER 2008)。
任务:
某些用户使用网站创建记录。适当的行插入到表中。该行具有到另一个表的外键,其值在过程中设置。然后,我希望应用程序将记录(更改外键字段)重新分配给另一个,如果它在1分钟内未处理。
例如:
1.用户创建记录A(id = 1, adminId = 1)
2.只有id = 1的管理员才能看到这条记录,他应该在1分钟内处理它。
3.如果管理员1在1分钟内未处理记录,则应将其重新分配给其他管理员。例如A更新至(adminId = 3)
哪种方式会更好地做到这一点?并行线程?在后台的另一个应用或...定期事件实现

回答

1

我不认为你需要一个单独的过程来处理时间。

如果您追踪记录创建时间,可以在应用程序逻辑或数据库过程中实现上述操作 - 每次从数据库中提取数据时都会发生这种情况。

所以

  1. 用户创建记录A(ID = 1,adminId = 1)与时间戳记TS
  2. 如果管理员试图访问该记录的分贝/应用程序将允许它,如果电流之间的差日期/时间和ts小于1分钟;如果更多然后1分钟记录被重新分配给其他管理
  3. 如果另一个管理员试图访问记录,更再用1分钟已通过记录被分配给他们(一分钟?)

所有上述工作没有另一个进程协调它(上述所有的数据)并且数据库可以用于锁定(通过可以在记录上加盖的状态和时间状态)。

只有当您想要推送记录或自动完成上述维护时(对于某些报告)。仍然可以通过检查记录是否在获取其他数据之前重新分配来完成。

有另一个进程并让它一样稳定DB是不平凡的,但您可以创建jobs这将定期内DB环境中运行(或者更适用于你的情况,你可以去SMO路径)。

但是,我相信你没有描述记录可能存在的所有状态(如果adminId | 3不处理记录,会发生什么情况)。

编辑 之后的评论让我解释一下。 假设你需要每5分钟(或每1分钟)完成一些工作,那么无论你实际上是否每分钟做一次或者如果你是在用户第一次请求可能受到影响的数据它。

有两个方法之间的差异,主要有以下 如果是懒洋洋地做 - 没有更新,除非用户请求数据,那么

懒惰更新与及时更新

  • 的情况下在这张桌子上,您可以节省不必要的定期更新(但是必须确保没有客户端正在收到过时的数据! - 例如,在数据库上运行报告需要您确保数据已更新)
  • 如果在这个表上有大量活动,会有一些开销(如果在一分钟内有100个请求,那么检查数据是否是最新的将需要额外的资源)
  • 您避免了需要管理和你避免依靠工作(较简单)
+0

问题是记录将在管理员之间迭代,直到他们中的任何一个处理它。它应该从一个管理员列表中隐藏起来,在其他人的列表中显示。 – 2011-04-19 10:19:30

+0

@JooLio,再次阅读,您隐藏记录的要求并不冲突 - 您可以先用一个简单的过程先做好准备 - Dalex为您提供了有关检索数据的查询的更多详细信息,但您可以使用sp在服务器上你可以用管理员姓名和sp调用将检查是否有任何记录需要重新分配,更新它们(如果有必要)并将它们返回给管理员请求数据... – Unreason 2011-04-19 10:24:09

+0

哦,你给了更多的信息,然后我需要。谢谢! – 2011-04-19 14:55:08

1

你不需要外部工具。所有的逻辑都可以内置。 您应该在表中添加包含时间的列,例如LastHandleTime并锁定。在你的榜样,当口语陪练尝试搜索一些东西,逻辑应该是这样的:

SELECT * FROM Table Where 
    (user='Admin3') Or 
    (DATEDIFF(m,GETDATE(),@LastHandleTime)=1 
     And dbo.fn_ChangeAdminName('Admin3') 
and locked=0) 

这里功能fn_ChangeAdminName()显示哪些用户可以访问的,而不是“原始”的用户记录。