关于用多线程查询数据的问题。。。

jt9079 2010-12-11 02:06:17
表结构大致如下

id username state
1 a 0
2 b 0
3 c 0
4 d 0
5 e 0
6 f 0
7 h 0
8 l 0
9 g 0

要求 每次查询两行内容(只查询state = 0 的内容),并同时把被查询的内容的 state 修改为 1

需要用到多线程查询,至少两个线程
现在有时候会出现线程1已经查询出来的数据,线程2也会查询出来,造成重复查询。

请教有什么方法可以避免已经查询过的数据,不会再被查询出来?
...全文
222 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jt9079 2010-12-15
  • 打赏
  • 举报
回复
怎么没人了。。。。。
jt9079 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyq11 的回复:]
SELECT * FROM table WITH (HOLDLOCK)

加锁语句:
sybase:
update 表 set col1=col1 where 1=0 ;
MSSQL:
select col1 from 表 (tablockx) where 1=0 ;
oracle:
LOCK TABLE 表 IN EXCLUSIVE MODE ;
加锁后其它人不可操作,直到加……
[/Quote]

给表加锁是不行的。。
因为在查询的时候,还会新增数据的。。
迷茫的主宰 2010-12-11
  • 打赏
  • 举报
回复
使用Lock
wuyq11 2010-12-11
  • 打赏
  • 举报
回复
SELECT * FROM table WITH (HOLDLOCK)

加锁语句:
sybase:
update 表 set col1=col1 where 1=0 ;
MSSQL:
select col1 from 表 (tablockx) where 1=0 ;
oracle:
LOCK TABLE 表 IN EXCLUSIVE MODE ;
加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

多使用几个Thread对象来做,也可以,使用
BackgroudWorker组件
silwol 2010-12-11
  • 打赏
  • 举报
回复
为什么要用多线程?
jt9079 2010-12-11
  • 打赏
  • 举报
回复
每次在线程调用读取函数时先判断tState的值,若是本线程刚操作完则继续等待(这种情况几乎不会存在),若否则锁定tState、rowNum并将tState修改为本线程标识,将rowNum+2 然后释放它们。再然后就可以放心读取数据了

这个不太理解。。。
能否说清楚一点?
jt9079 2010-12-11
  • 打赏
  • 举报
回复
还有更好的思路么?
莫名其 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhengwen379 的回复:]
这涉及到线程同步的问题了。个人想法是:
1,把查询库的代码写成一个函数。形参是数据库连接串和查询语句;
2,使用lock关键字锁住这个函数。也就是当一个线程执行到这里的时候其他线程不能在访问,直到执行完毕。
[/Quote]

2楼的确实是一个解决办法,不过体现不出多线程的效率来····

鄙人的想法是这样:
定义两个变量,一个tState存储线程操作状态(为1则是第一个线程刚操作完,为2则是第二个线程,以此类推;或者直接存储线程标识),一个rowNum存储读取到的行数(数据库里的ID)。
每次在线程调用读取函数时先判断tState的值,若是本线程刚操作完则继续等待(这种情况几乎不会存在),若否则锁定tState、rowNum并将tState修改为本线程标识,将rowNum+2 然后释放它们。再然后就可以放心读取数据了
zhengwen379 2010-12-11
  • 打赏
  • 举报
回复
这涉及到线程同步的问题了。个人想法是:
1,把查询库的代码写成一个函数。形参是数据库连接串和查询语句;
2,使用lock关键字锁住这个函数。也就是当一个线程执行到这里的时候其他线程不能在访问,直到执行完毕。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧