首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于数据实时获取,实时状态更新,多个线程扫描数据库有关问题

2012-03-26 
关于数据实时获取,实时状态更新,多个线程扫描数据库问题A 任务表,B 生产表;C 存储过程,说明: 导入任务表大

关于数据实时获取,实时状态更新,多个线程扫描数据库问题

A 任务表,

B 生产表;

C 存储过程,

说明: 导入任务表大量数据,然后10个客户端,每个客户端启动6个线程,通过调用C 存储过程,获取N条(N > 0 and N < 100)A任务表中的数据

然后对每条数据进行处理,然后处理完成,更新A 表中的数据状态,然后入库B 生产表 ;每个线程可能3秒左右处理一条数据,更新A 表状态,insert B

1、实时导入 数据到 A表 N条记录

3、存储过程 每次根据设定的 记录数 获取N条记录,select Top N update 

现在的问题是,当启动6个客户端,36个线程同时获取任务的时候,非常流畅;但是再启动客户端 增加的 50~60线程以上,每次线程获取任务的时候,都会影响别的线程,别的线程可能对 A

的状态更新 慢了很多,怀疑进行了锁表处理,但是我在存储过程中已经非常简化了,而且进行了行锁处理;不知道还有没有好的方法进行优化处理?

C 存储过程,
 CREATE proc GetFreeTicketInfo
  @NO varchar(20),
  @DistNo varchar(50) ,
  @Money int,
  @ICount Int --- ,LastTime = '+@DateTimeNo+'
as

BEGIN TRANSACTION GetTask
SET NOCOUNT ON
SET ROWCOUNT @ICount
IF @Money < 500 
  begin
exec( 'UPDATE AutoTaskInfo with (ROWLOCK) SET NO = '''+@NO+''',DistStatus=''1'' , DistNo= '+@DistNo+',LastTime = getdate() WHERE TotalMoney < 500 and 

DistStatus = ''0'' ' ) 
  end
Else
  begin
  exec( ' UPDATE AutoTaskInfo with (ROWLOCK) SET NO = '''+@NO+''',DistStatus=''1'' , DistNo= '+@DistNo+',LastTime = getdate() WHERE TotalMoney >= 500 

and DistStatus = ''0'' ' )
  end

COMMIT TRANSACTION GetTask

IF (@@error <> 0)
BEGIN
  ROLLBACK TRANSACTION GetTask
END

set rowcount 0
SET NOCOUNT OFF
GO



[解决办法]
不太看得明白,还有为什么不用触发器呢?
[解决办法]
数据库本身的性能
[解决办法]
楼主是要求在每个客户端取出未被处理的N条记录,然后分6个线程处理这些数据
而遇到的问题是为了避免客户端取出相同的数据而做了行锁导致了死锁是吧?

热点排行