2014-08-29 62 views
0

我正在编写一个应用程序。有30个线程读取一个表格进行输入。例如,提高并发选择和更新的性能

Select top 1 name from table1 where flag != 1 order by mypriority 

现在,当名称被读取时,位列被更新以标记该行被读取。例如,

Update table1 set flag = 1 where name = 'name' 

update语句就在select语句之后。 我面临的问题是,许多线程读取同一行,并因此处理重复工作的相同名称。

我想:

Select top 1 name from table1 with (updlock) where flag != 1 

这使得一次读取一行。线程等待一个更新完成。所以,他们可以读下一个名字。所以,没有多线程的好处。

有人可以建议最佳方法/使用方法。

请问,如果我的问题不是很清楚。

+0

是否有一个原因,你必须一次“读”一行?此外,你有一个查询与TOP但不是ORDER BY。这意味着每次运行此查询时,第一行可能会得到不同的值。 – 2014-08-29 18:15:10

+0

@SeanLange:我刚刚添加了订单。所以这些线程需要一行进行一些处理并将结果存储在其他行中。这种处理就像去一些网站并获取数据。 – 2014-08-29 18:18:41

回答

0

您可以使用事务来确保每一行都被读取一次。

begin transaction t 
Select top 1 name from table1 where flag != 1 order by mypriority 
Update table1 set flag = 1 where name = 'name' 
commit transaction t 

这里最大的问题是线程处理每行的时间似乎可以忽略不计。如果您的所有线程都在循环中运行这两个查询,则使用多线程将无法获得任何性能。

是否有充分的理由一次只读取一行?有没有很好的理由使用多线程? 请详细说明您正在努力达到的目标。

编辑你说你正在对你正在做的记录做一些处理。与执行您提交的两个查询相比,处理需要多长时间?如果处理时间小于查询的执行时间,则运行两个以上的线程是没有意义的。