Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 通过数据库发布唯一记录的策略?_Sql_Sql Server_Concurrency_Sql Server 2000_Locking - Fatal编程技术网

Sql 通过数据库发布唯一记录的策略?

Sql 通过数据库发布唯一记录的策略?,sql,sql-server,concurrency,sql-server-2000,locking,Sql,Sql Server,Concurrency,Sql Server 2000,Locking,我们有超过1个从不同位置运行的某个exe实例。exe应该获取一组记录并基于它们执行一些工作。从exe A获取的记录集不应由exe B获取,反之亦然。前妻A和B是相同的前妻;他们从不同的地方跑来。实例的数量可能会增加或减少。所有的前任可能会同时运行 那么我的问题是…我能解决这个问题的最好方法是什么 我曾考虑过使用事务,但作为exe源的表也被其他人使用(计划作业、网站等)。计划作业将数据插入源表 但是,如果必须使用事务,我可以使用BEGIN TRAN启动事务,然后使用with(TABLOCKX)提示

我们有超过1个从不同位置运行的某个exe实例。exe应该获取一组记录并基于它们执行一些工作。从exe A获取的记录集不应由exe B获取,反之亦然。前妻A和B是相同的前妻;他们从不同的地方跑来。实例的数量可能会增加或减少。所有的前任可能会同时运行

那么我的问题是…我能解决这个问题的最好方法是什么

我曾考虑过使用事务,但作为exe源的表也被其他人使用(计划作业、网站等)。计划作业将数据插入源表

但是,如果必须使用事务,我可以使用BEGIN TRAN启动事务,然后使用with(TABLOCKX)提示从源表中选择数据。如果在视图上执行此操作,会影响实际的底层表


我只想知道用于处理此问题的策略是什么…

一个选项可能是运行一个更新查询,该查询“标记”exe将获取的项目(where子句将其限制为仅标记尚未标记的项目)。然后进行第二次选择,以拉出标记的项目。因此,您可以运行SELECT查询,而不必担心更新和查询之间的延迟。只要更新以原子方式运行(通过可以快速关闭的事务),就不应该存在并发问题。

您希望避免进程之间的竞争条件。我在这里详细回答:


事务没有多大用处:这是您必须考虑的锁定策略,对并发性有连锁效应。

听起来是消息的最佳候选queueing@RichardOD:解释如何使用消息队列?我不确定何时将项目推送到消息队列中,以及推送后如何跟踪它们…+1,总结Dav:“创建一个标记字段,工作人员在处理行时将标记该字段。所有工作人员将查询未设置此标记的行,以确保没有多个工作人员对任何行执行操作。”是的。实现这一点的最简单方法是让标志实际标识出标记它的工作人员(例如,通过一个从0开始的int字段,然后设置为工作人员id号);这样,您可以随时重新提取标记为供自己使用的项目。