Sql 通过数据库发布唯一记录的策略?
我们有超过1个从不同位置运行的某个exe实例。exe应该获取一组记录并基于它们执行一些工作。从exe A获取的记录集不应由exe B获取,反之亦然。前妻A和B是相同的前妻;他们从不同的地方跑来。实例的数量可能会增加或减少。所有的前任可能会同时运行 那么我的问题是…我能解决这个问题的最好方法是什么 我曾考虑过使用事务,但作为exe源的表也被其他人使用(计划作业、网站等)。计划作业将数据插入源表 但是,如果必须使用事务,我可以使用BEGIN TRAN启动事务,然后使用with(TABLOCKX)提示从源表中选择数据。如果在视图上执行此操作,会影响实际的底层表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)提示
我只想知道用于处理此问题的策略是什么…一个选项可能是运行一个更新查询,该查询“标记”exe将获取的项目(where子句将其限制为仅标记尚未标记的项目)。然后进行第二次选择,以拉出标记的项目。因此,您可以运行SELECT查询,而不必担心更新和查询之间的延迟。只要更新以原子方式运行(通过可以快速关闭的事务),就不应该存在并发问题。您希望避免进程之间的竞争条件。我在这里详细回答:
事务没有多大用处:这是您必须考虑的锁定策略,对并发性有连锁效应。听起来是消息的最佳候选queueing@RichardOD:解释如何使用消息队列?我不确定何时将项目推送到消息队列中,以及推送后如何跟踪它们…+1,总结Dav:“创建一个标记字段,工作人员在处理行时将标记该字段。所有工作人员将查询未设置此标记的行,以确保没有多个工作人员对任何行执行操作。”是的。实现这一点的最简单方法是让标志实际标识出标记它的工作人员(例如,通过一个从0开始的int字段,然后设置为工作人员id号);这样,您可以随时重新提取标记为供自己使用的项目。