sql server语言 - 周期性事件实现



我有一个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)
哪一种方法更好?并行的线程吗?另一个后台应用程序?还是…

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

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

  1. 用户创建时间戳为ts的记录A(id = 1, adminId = 1)
  2. 如果管理员试图访问记录,如果当前日期/时间与ts之间的差异小于1分钟,db/app将允许它;如果超过1分钟,记录将被重新分配给另一个管理员
  3. 如果其他管理员试图访问记录并且超过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()显示哪些用户可以访问记录,而不是"原始"用户。

最新更新