通过db发布唯一记录的策略?

时间:2009-10-19 10:45:28

标签: sql sql-server concurrency sql-server-2000 locking

我们有来自不同位置的特定exe的多个实例。一个exe应该获取一组记录并根据它们做一些工作。从exe A获取的记录集不应由exe B获取,反之亦然。 Exes A& B是同样的前辈;他们从不同的地方跑。实例的数量可以增加或减少。所有的exes有时可能同时运行。

所以提出我的问题......我能解决这个问题的最佳方法是什么?

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

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

我只想知道用于解决这个问题的策略是什么......

2 个答案:

答案 0 :(得分:1)

一个选项可能是运行一个UPDATE查询,该查询“标记”exe将要获取的项目(使用where子句将其约束为仅标记尚未标记的项目)。然后再做第二个SELECT,它会拉出标记的项目。因此,您可以运行SELECT查询,而无需担心UPDATE与它之间的延迟。只要原子地运行UPDATE(通过可以快速关闭的事务),就不会出现并发问题。

答案 1 :(得分:1)

您希望避免进程之间的竞争条件。我在这里的答案详细说明:SQL Server Process Queue Race Condition

事务并没有多大用处:它是你必须考虑的锁定策略,它会对并发产生影响。