定期事件实施

时间:2011-04-19 09:45:38

标签: sql-server sql-server-2008 asp.net-mvc-2

我有一个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}}更新 这样做会更好吗?并行线程?在后台的另一个应用?还是......

2 个答案:

答案 0 :(得分:1)

我认为您不需要单独的流程来处理时间。

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

所以

  1. 用户使用时间戳ts
  2. 创建记录A(id = 1,adminId = 1)
  3. 如果管理员尝试访问记录,则当前日期/时间与ts之间的差异小于1分钟时,db / app将允许该记录;如果超过1分钟,记录将被重新分配给另一个管理员
  4. 如果其他管理员尝试访问记录并且超过1分钟已经过了,则会为其分配记录(另一分钟?)
  5. 以上所有工作都没有其他进程协调它(以上所有数据)和数据库可用于锁定(通过某些状态和状态时间可以在记录上标记)。

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

    拥有另一个进程并使其像数据库一样稳定,这是非常重要的,但您可以创建jobs,它将在数据库环境中定期运行(或者您可以{{3路径,如果更适用于您的方案)。

    但是,我相信你没有描述记录可以拥有的所有状态(如果adminId | 3没有“处理”记录,会发生什么)。

    修改 评论后让我解释一下。 假设您需要每5分钟(或每一分钟)完成一些工作,那么无论您是在实际执行此操作还是在第一次执行此操作之前,用户请求可能受其影响的数据都无关紧要

    这两种方法存在差异,主要有以下几种 如果它是懒惰地完成 - 除非用户请求数据,否则不进行更新

    延迟更新与及时更新

    • 在此表上活动较少的情况下,您可以节省不必要的定期更新(但必须确保没有客户端获取过时的数据! - 例如,在数据库上运行报告将要求您确保数据已更新)
    • 如果此表有大量活动,则会产生一些开销(如果在一分钟内有100个请求,那么检查数据是否是最新的将需要额外的资源)
    • 你避免有额外的工作需要管理而你不再依赖工作(不太复杂)

答案 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()显示哪些用户可以访问记录而不是“原始”用户。