我有一个表,我存储的信息需要批处理并每隔几个小时发送一次。此表中的每一行对应一个我需要批处理的项目。每隔几个小时,我会查询所有新行where the state = 'New'
。
当我开始批处理这些行时,我想将行的状态设置为“批处理”,一旦我完成批处理,我想将状态设置为“已完成”。
以下SQL是否会更有效:
UPDATE BatchTable SET state = <random number> where state = 'New';
SELECT * from BatchTable where state = <random number>;
首先执行UPDATE
,是否会避免两个线程执行SELECT然后可能必须处理阻塞而另一个线程正在执行批处理/更新行的情况?如果我执行UPDATE
,是否会避免阻塞其他线程?
有没有完全不同的,更好的方法来做到这一点?
答案 0 :(得分:1)
我看到你的担心:当select语句正在执行时,可能会添加新行,但是更新会被更新捕获,而不是select。所以...通过在测试中引入第三个值,您的方法是最直接的。你可以玩的另一件事,我很抱歉,因为我没有经常使用它:OUTPUT子句:http://msdn.microsoft.com/en-us/library/ms177564.aspx。这将允许您从select语句执行更新并获取值我相信所有在一个语句中。