我有一个ASP.NET MVC 2网站。所有的buisnes都在数据库存储过程中(MS SQL SERVER 2008)
任务:
一些用户使用网站创建记录。适当的行插入表中。此行具有另一个表的外键,其值设置在过程中。然后我希望应用程序重新分配记录(更改外键字段)到另一个,如果它在1分钟内没有处理
例如:
1.用户创建记录A(id = 1, adminId = 1)
2.只有id = 1的管理员才能看到此记录,他应该在1分钟内处理
3.如果admin 1在1分钟内未处理记录,则应将其重新分配给另一个管理员。例如A
的{{1}}更新
这样做会更好吗?并行线程?在后台的另一个应用?还是......
答案 0 :(得分:1)
我认为您不需要单独的流程来处理时间。
如果跟踪记录创建时间,可以在应用程序逻辑或数据库过程中实现上述操作 - 每次从数据库中提取数据时都会发生这种情况。
所以
以上所有工作都没有其他进程协调它(以上所有数据)和数据库可用于锁定(通过某些状态和状态时间可以在记录上标记)。
只有您想要推送记录或自动完成上述维护(对于某些报告)。仍然可以通过在获取其他数据之前检查记录是否已被重新分配来完成。
拥有另一个进程并使其像数据库一样稳定,这是非常重要的,但您可以创建jobs,它将在数据库环境中定期运行(或者您可以{{3路径,如果更适用于您的方案)。
但是,我相信你没有描述记录可以拥有的所有状态(如果adminId | 3没有“处理”记录,会发生什么)。
修改强> 评论后让我解释一下。 假设您需要每5分钟(或每一分钟)完成一些工作,那么无论您是在实际执行此操作还是在第一次执行此操作之前,用户请求可能受其影响的数据都无关紧要
这两种方法存在差异,主要有以下几种 如果它是懒惰地完成 - 除非用户请求数据,否则不进行更新
延迟更新与及时更新
答案 1 :(得分:1)
您不需要外部工具。所有逻辑都可以内置。 您应该在表中添加带有时间的列,例如LastHandleTime并锁定。在您的示例中,当Admin3尝试搜索某些内容时,逻辑应该是这样的:
SELECT * FROM Table Where
(user='Admin3') Or
(DATEDIFF(m,GETDATE(),@LastHandleTime)=1
And dbo.fn_ChangeAdminName('Admin3')
and locked=0)
此处函数fn_ChangeAdminName()显示哪些用户可以访问记录而不是“原始”用户。