2

我有一个表来存储我需要每隔几个小时批量发送的信息。此表中的每一行对应一个我需要批处理的项目。每隔几个小时,我就会查询所有新行where the state = 'New'

当我开始批处理这些行时,我想将行的状态设置为“批处理”,一旦完成批处理,我想将状态设置为“完成”。

下面的 SQL 会不会更高效:

   UPDATE BatchTable SET state = <random number> where state = 'New';
   SELECT * from BatchTable where state = <random number>;

通过做UPDATE第一个,它是否可以避免两个线程执行 SELECT 然后可能不得不处理在另一个线程对行进行批处理/更新时被阻塞的情况?如果我做一个UPDATE,它会避免被其他线程阻塞吗?

有没有完全不同的更好的方法来做到这一点?

4

1 回答 1

1

我看到了您的担忧:在执行 select 语句时,可能会添加被更新而不是 select 捕获的新行。所以...通过在测试中引入第三个值,您的方法在这里是最直接的。你可以玩的另一件事,我很抱歉,因为我没有经常使用它:OUTPUT 子句:http: //msdn.microsoft.com/en-us/library/ms177564.aspx。这将允许您从 select 语句中进行更新并取回值,我相信所有这些都在一个语句中。

于 2013-02-06T23:37:30.217 回答