Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 当使用SQLServer2000表作为工作队列时,有哪些方法可以编写可伸缩服务?_Sql Server_Database_Database Design_Sql Server 2000_Queue - Fatal编程技术网

Sql server 当使用SQLServer2000表作为工作队列时,有哪些方法可以编写可伸缩服务?

Sql server 当使用SQLServer2000表作为工作队列时,有哪些方法可以编写可伸缩服务?,sql-server,database,database-design,sql-server-2000,queue,Sql Server,Database,Database Design,Sql Server 2000,Queue,如果我使用SQL server 2000数据库表作为要执行的工作队列,那么以可扩展的方式执行该工作的最佳方法是什么?场景:有一个windows服务将为表中的每一行执行一些可能会长期运行的工作。当只有一个服务在运行时,很容易抓取前10或100行,执行工作(即使是以多线程方式),然后更新这10或100行以表示工作已完成。如果我想在两台服务器上运行相同的服务,我需要一个锁定机制,这样服务就不会占用相同的行。我最初的想法是在表中添加一个字段,该字段指示在执行工作时行被锁定,因此服务将更新此“锁定”字段,

如果我使用SQL server 2000数据库表作为要执行的工作队列,那么以可扩展的方式执行该工作的最佳方法是什么?场景:有一个windows服务将为表中的每一行执行一些可能会长期运行的工作。当只有一个服务在运行时,很容易抓取前10或100行,执行工作(即使是以多线程方式),然后更新这10或100行以表示工作已完成。如果我想在两台服务器上运行相同的服务,我需要一个锁定机制,这样服务就不会占用相同的行。我最初的想法是在表中添加一个字段,该字段指示在执行工作时行被锁定,因此服务将更新此“锁定”字段,直到工作完成,并且在选择要处理的一组行时,将确保行未被锁定

这是处理此类工作的最佳方法,还是可以使用数据库级别的行锁定来执行相同的操作?我知道一个更理想的解决方案可能是消息队列,但让我们假设我想使用一个数据库表作为工作队列。还有人建议,在Oracle世界中,这种类型的事情要简单得多,数据库级别的行锁定将是解决方案,我在SQL Server 2000上使用行锁定的运气并不好,但可能缺少一些东西


更新:添加标记如果选择使用数据库表而不是消息队列框架,则可以使用以下模式:

向队列表中添加一列用于拥有工作进程。当工作人员查找新工作时,它可以在工作人员列为null的队列中查询下一个工作的队列表:

SELECT TOP 1 JobId, JobData FROM Queue WHERE Worker IS NULL ORDER BY QueueTime
然后,工作者可以通过执行update语句来尝试声明作业的所有权:

UPDATE Queue SET Worker = 'workerid' WHERE JobId = 'jobid' AND Worker IS NULL
如果没有行受此update语句的影响,则工作人员可以假定另一个工作人员抢先声明所有权,从而继续进行下一个作业。如果worker成功地更新了worker列,它就可以完成这项工作

您还应该跟踪崩溃或挂起的工作线程,并为挂起或挂起的工作线程声明的作业重置工作线程列。这些工作将由其他工人承担。请注意,这意味着需要设计作业,以便可以重试。通过让工人定期敲打工作台,可以跟踪被吊死或撞死的工人