我有一个ASP。NET MVC 2网站。所有业务都在数据库存储过程(MS SQL SERVER 2008)中。
任务:
有些用户使用网站创建记录。将适当的行插入到表中。该行具有另一个表的外键,其值在过程中设置。然后我希望应用程序重新分配记录(更改外键字段)到另一个,如果它在1分钟内没有处理。
例如:
1. 用户创建记录A(id = 1, adminId = 1)
。
2. 只有id=1的管理员才能看到这个记录,他应该在1分钟内处理它。
3.如果admin 1在1分钟内没有处理记录,则应将其重新分配给其他管理员。例如,A
更新为(adminId = 3)
。
哪一种方法更好?并行的线程吗?另一个后台应用程序?还是…
我认为你不需要一个单独的进程来处理时间。
如果您跟踪记录创建时间,则可以在应用程序逻辑中实现上述功能或作为数据库过程-每次从数据库中提取数据时都会发生。
- 用户创建时间戳为ts的记录A(id = 1, adminId = 1)
- 如果管理员试图访问记录,如果当前日期/时间与ts之间的差异小于1分钟,db/app将允许它;如果超过1分钟,记录将被重新分配给另一个管理员
- 如果其他管理员试图访问记录并且超过1分钟,则将记录分配给他们(另一分钟?)
上述所有工作都不需要另一个进程协调(以上所有进程都提取数据),并且数据库可以用于锁定(通过可以在记录上盖章的某些状态和状态时间)。
只有当您想要推送记录或自动完成上述维护(对于某些报告)时才会这样做。然而,在获取其他数据之前,总是可以通过检查记录是否已被重新分配来完成。
拥有另一个进程并使其与DB一样稳定是非常重要的,但是您可以创建在DB环境中定期运行的作业(或者如果更适合您的场景,您可以使用SMO路径)。
但是,我相信你没有描述记录可能具有的所有状态(如果adminId|3不'处理'记录会发生什么)。
编辑在评论之后,让我解释一下。假设您需要每5分钟(或每一分钟)完成一些工作,那么无论您是每分钟都在做它,还是在用户请求可能受其影响的数据之前第一次做它,都无关紧要。
两种方法的不同之处主要有以下几点如果是惰性的——除非用户请求数据否则不更新
延迟更新与及时更新
- 在此表上的活动较低的情况下,您可以节省不必要的定期更新(但必须确保没有客户端获取过时的数据!-例如,在数据库上运行报告将要求您确保数据更新)
- 如果该表上有大量活动,则会有一些开销(如果在一分钟内有100个请求,则检查数据是否最新将需要额外的资源)
- 你避免有额外的需要管理的工作,你避免依赖于工作(不太复杂)
您不需要外部工具。所有的逻辑都可以内置。您应该在表中添加带有时间的列,例如lastandletime和locked。在您的示例中,当Admin3尝试搜索某些内容时,逻辑应该是这样的:
SELECT * FROM Table Where
(user='Admin3') Or
(DATEDIFF(m,GETDATE(),@LastHandleTime)=1
And dbo.fn_ChangeAdminName('Admin3')
and locked=0)
这里函数fn_ChangeAdminName()显示哪些用户可以访问记录,而不是"原始"用户。