Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 定期事件执行_Sql Server_Sql Server 2008_Asp.net Mvc 2 - Fatal编程技术网

Sql server 定期事件执行

Sql server 定期事件执行,sql-server,sql-server-2008,asp.net-mvc-2,Sql Server,Sql Server 2008,Asp.net Mvc 2,我有一个ASP.NETMVC2网站。所有业务都在数据库存储过程中(MS SQL SERVER 2008)。 任务: 一些用户使用web站点创建记录。将适当的行插入表中。此行具有另一个表的外键,其值在过程中设置。然后,我希望应用程序将记录(更改外键字段)重新分配给另一个记录,如果它在1分钟内未被处理。 例如: 1.用户创建记录A(id=1,adminId=1) 2.只有id=1的管理员才能看到此记录,他应在1分钟内处理此记录。 3.若管理员1在1分钟内未处理记录,则应将其重新分配给其他管理员。例如

我有一个ASP.NETMVC2网站。所有业务都在数据库存储过程中(MS SQL SERVER 2008)。
任务:
一些用户使用web站点创建记录。将适当的行插入表中。此行具有另一个表的外键,其值在过程中设置。然后,我希望应用程序将记录(更改外键字段)重新分配给另一个记录,如果它在1分钟内未被处理。
例如:
1.用户创建记录
A(id=1,adminId=1)

2.只有id=1的管理员才能看到此记录,他应在1分钟内处理此记录。
3.若管理员1在1分钟内未处理记录,则应将其重新分配给其他管理员。例如
A
更新到
(adminId=3)


哪种方式更好?平行线?另一个后台应用程序?或者…

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

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

所以

  • 用户创建带有时间戳ts的记录A(id=1,adminId=1)
  • 如果管理员试图访问记录,则如果当前日期/时间与ts之间的差异小于1分钟,db/app将允许该记录;如果超过1分钟,记录将被重新分配给其他管理员
  • 如果另一个管理员试图访问这些记录,并且时间超过1分钟,则会将该记录分配给他们(另一分钟?)
  • 所有上述操作都不需要另一个进程来协调(所有上述操作都会拉取数据),并且数据库可以用于锁定(通过可以在记录上标记的某些状态和状态时间)

    仅当您希望推送记录或自动完成上述维护时(对于某些报告)。不过,在获取其他数据之前,始终可以通过检查记录是否已重新分配来完成

    拥有另一个进程并使其与DB一样稳定是非常重要的,但您可以创建一个在DB环境中周期性运行的进程(或者,如果更适合您的场景,您可以选择path)

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

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

    这两种方法存在差异,主要有以下几点 如果延迟完成,则除非用户请求数据,否则不会进行更新

    延迟更新与及时更新

    • 如果此表上的活动较少,则保存不必要的定期更新(但必须确保没有客户机获取过时数据!-例如,在数据库上运行报告将要求您确保数据已更新)
    • 如果此表上的活动较多,则会产生一些开销(如果一分钟内有100个请求,则检查数据是否最新将需要额外的资源)
    • 您避免了需要管理的额外工作,也避免了依赖这些工作(不太复杂)

      • 您不需要外部工具。所有逻辑都可以内置。 您应该在表中添加带有时间的列,例如LastHandleTime和locked。在您的示例中,当Admin3尝试搜索某个内容时,逻辑应该如下所示:

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

        函数fn\u ChangeAdminName()显示哪些用户可以访问记录,而不是“原始”用户。

        问题是记录将在管理员之间迭代,直到他们中的任何一个处理它为止。它真的应该隐藏在一个管理员的列表中,并显示在另一个管理员的列表中。@JooLio,请再次阅读,您隐藏记录的要求没有冲突-您可以通过一个简单的过程使先到先得-Dalex为您提供了检索数据的查询的更多细节,但是你可以在服务器上有一个sp,你可以用管理员的名字调用它,sp会检查是否有任何记录需要重新分配,更新它们(如果必要)并将它们返回给请求数据的管理员…哦,你提供了更多的信息,然后我需要。谢谢