Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新然后选择是否更有效地获取表中的新行?_Sql - Fatal编程技术网

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,在第一个线程提交之前,这不会导致阻塞其他线程吗?