日期:2014-05-18  浏览次数:20579 次

线程锁表问题,能解决吗?
表info
title,isread

能否查询表的时候只允许一个线程查询,但允许另外的线程添加数据
我想查询info的时候同时只允许一个线程查询,因为查询完我就更新isread为读了,所以同时允许多个线程查询会出现问题,但查询的时候该表还是可以添加数据的?
最好给出添加和查询两个SQL


--上面如何理解了,下面可以不看------------------------------
给了个简化的问题模型如下

表info结构
title,isread

表info2结构
title

表info被多个线程操作,操作方式为两种(A类线程为添加数据,B类线程为更新数据)
1.多个A类线程向info表添加数据,添加的数据isread默认为未读0(非常频繁,每秒添加数十条)
2.多个B类线程不停的查询info表中是否有未读的数据,如果有,将title的运算值插入另一张表info2,同时更新info表isread为1(比较频繁,每秒更新几条)
(注:因系统参数不同不能减少B类线程,如果B类线程只允许一个就不存在问题咯)


现在问题是如果有多个B类线程读取info表,可能导致插入info2的数据重复。比如,B1,B2,B3三个B类线程同时查询info都得到一个同一个title,运算后向info2插入了数据就导致两条数据重复。
如果有B类线程查询info表锁表不允许另外的B类线程查询,那么可能A类线程就无法向表info插入数据了,这个问题能解决吗??
最好能给出详细SQL语句



------解决方案--------------------
这个问题要锁+索引才能解决

a类线程的insert语句可保持不变

b类线程的语句改成类似如下:

--2005 & 2008
update info set isread=1 
output deleted.title INTO info2(title)
where isread=0

 
info的聚集索引设为isread

基本上就是这样了。

------解决方案--------------------
感觉你的系统设计的有问题,最好从根上找问题。如果在一个错的前提下,只能是更多的错误。
大概理解你的意思是:有多个线程负责采集数据,到info表里,然后从info表里提取数据进行处理,处理的时候不能重复提取。
提2个思路:
1、改程序,只有一个线程从info里提取数据,处理数据的线程再从这个线程里获取。
2、用存储过程取数据,取的过程中锁定表,然后给取过的数据设置标志。