A 任务表,B 生产表;C 存储过程,说明: 导入任务表大量数据,然后10个客户端,每个客户端启动6个线程,通过调用C 存储过程,获取N条(N > 0 and N < 100)A任务表中的数据然后对每条数据进行处理,然后处理完成,更新A 表中的数据状态,然后入库B 生产表 ;每个线程可能3秒左右处理一条数据,更新A 表状态,insert B1、实时导入 数据到 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+'
asBEGIN 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'' ' )
  endCOMMIT TRANSACTION GetTaskIF (@@error <> 0)
BEGIN
  ROLLBACK TRANSACTION  GetTask
ENDset rowcount 0
SET NOCOUNT OFF
GO

解决方案 »

  1.   

    每个线程 根据设定的数量 获取记录条数;然后处理更新每个条数的状态为【已经处理】,让把处理过的数据,insert保存到 最后一个新表中。
      

  2.   

    我现在用的是 SQLserver2000 ,换数据库?
      

  3.   

    UPDATE AutoTaskInfo with (ROWLOCK) SET NO = '''+@NO+''',DistStatus=''1'' , DistNo= '+@DistNo+',LastTime = getdate() WHERE TotalMoney >= 500 要说锁 也只是这个语句吧,不会所有线程获取 的时候,导致其他 记录无法更新??
      

  4.   

    UPDATE AutoTaskInfo with (ROWLOCK) SET NO = '''+@NO+''',DistStatus=''1'' , DistNo= '+@DistNo+',LastTime = getdate() WHERE TotalMoney >= 500这个语句 现在我测试 不能并发 
    如何支持并发,