Sql 更新然后选择是否更有效地获取表中的新行?
我有一个单独的表,用于存储需要每隔几个小时进行批处理和发送的信息。此表中的每一行对应一个需要批处理的项目。每隔几个小时,我会查询所有新行Sql 更新然后选择是否更有效地获取表中的新行?,sql,Sql,我有一个单独的表,用于存储需要每隔几个小时进行批处理和发送的信息。此表中的每一行对应一个需要批处理的项目。每隔几个小时,我会查询所有新行,其中state='new' 当我开始对这些行进行批处理时,我想将行的状态设置为“批处理”,一旦完成批处理,我想将状态设置为“完成” 以下SQL是否更高效: UPDATE BatchTable SET state = <random number> where state = 'New'; SELECT * from BatchTable
,其中state='new'
当我开始对这些行进行批处理时,我想将行的状态设置为“批处理”,一旦完成批处理,我想将状态设置为“完成”
以下SQL是否更高效:
UPDATE BatchTable SET state = <random number> where state = 'New';
SELECT * from BatchTable where state = <random number>;
updatebatchtable SET state=where state='New';
从状态为的BatchTable中选择*;
通过首先执行更新
,是否可以避免两个线程执行一个SELECT,然后在另一个线程对行进行批处理/更新时可能不得不处理被阻塞的情况?如果我执行更新
,它会避免来自其他线程的阻塞吗
是否有一种完全不同的更好的方法来实现这一点?我明白您的担忧:在执行select语句时,可能会添加被更新捕获的新行,而不是select语句。所以通过在测试中引入第三个值,您的方法是最直接的。另一件你可以玩的东西是:OUTPUT子句:。这将允许您从select语句执行更新,并在一个语句中返回值 您正在使用哪些RDBMS?当一个新的记录被插入时,你不能使用一个触发器将记录放进<代码>批处理< /代码>吗?这个设计是有缺陷的,因为一个记录可以是<代码>新的< /代码>,然后在将数据轮询到数据中以将它包含在<代码>批处理< /代码>之前。请考虑使用“选择更新”,这里是mySql和Oracle的参考:@yack-我不认为它有缺陷,因为我假设正在批处理的每个线程在发布更新时都会获得当前“新”的所有行。如果添加了后续行,则将在下一次批处理调用中处理该行。如果另一个线程将状态设置为,则假定该线程将批处理该行,这样可以避免重复。@Osy-如果有多个线程执行SELECT for update,在第一个线程提交之前,这不会导致阻塞其他线程吗?