有2个数据表A,B我有一个winform程序,同时运行在多台PC机上,这个程序的功能是:定时在A表中取一百条数据,每一条数据进行相应的处理后插入到B表中,并在A表中删除该记录。出现了问题:B表中出现很多重复的记录。winform程序是用c#.net写的。用的是dataset存储那100条记录进行操作,离线并发该怎么做。谢谢各位了。

解决方案 »

  1.   

    在A表中增加一个标记字段,任何一个winform读了一条记录后就设置这个标记,
    假设你的winform程序都有一个独立的ID,就用这个ID去标记这条被处理的记录。
    其他的winform程序就不会重复读取已经被标记过的记录。
      

  2.   

    1、加字段标示,
    2、或者用一下方法读取数据,
       SELECT * FROM test_user WITH (READPAST,ROWLOCK)
      READPAST 忽略锁,不读取被锁定的行
      ROWLOCK 对行进行加锁,下次别的机器就不会读取了,呵呵
      

  3.   

    出现的问题是运行在多个机子上的WINFORM程序将这些记录重复操作了(在有人操作这100条记录中的一条时)做法:对表加琐,只要有有人操作就将起关闭
      

  4.   

    俺喜欢6楼的方法,但好像要加事务begin tran --前台程序写
       SELECT top 100  *   FROM   test_user   WITH   (READPAST,ROWLOCK) 
       .......
       delete  .....
    commit tran 
      

  5.   

    select top 100 * from table WITH (NOLOCK)
      

  6.   

    select top 100 * from table WITH (ROWLOCK)
      

  7.   

    roy_88 
    中国风 
    -------------------那一百条怎么加锁阿。小弟是个初学者啊。。谢谢了
      

  8.   

    select   top   100   *   from   table   WITH   (ROWLOCK)
      

  9.   

    --事务1
    begin tran
    SET ROWCOUNT 100SELECT * FROM tb WITH(UPDLOCK, READPAST)---事务2
    BEGIN TRANSET ROWCOUNT 100SELECT * FROM tb WITH(UPDLOCK, READPAST)
      

  10.   

    看一下sql的事务,共分四个等级
      

  11.   

    1、加字段标示, 
    2、或者用一下方法读取数据, 呵呵,和上面的锁顺序换一下
       SELECT * FROM test_user WITH (ROWLOCK,READPAST) 
       --ROWLOCK 对行进行加锁,下次别的机器 用 READPAST 方式就不会读取了,呵呵
        --READPAST 忽略锁,忽略(不读取)被锁定的行 
      

  12.   

    你的表应该有主键吧? (没有主键(或者唯一键)会存在数据定位的问题)
    SET NOCOUNT ON 
    -- 取数据可以这样定
    DECLARE 
    @主键 int -- 根据你的主键定义(也可以是唯一键)SET ROWCOUNT 1 -- 只取一条
    UPDATE A SET
    @主键 = 主键,
    标记 = N'已取'
    FROM 你的表
    WHERE 标记 = N'未取'SELECT * FROM 你的表
    WHERE @主键 = 主键
      

  13.   

    完成操作后再根据主键值把记录删除掉即可.
    默认情况下, SELECT 只下共享锁, 不会防止别人访问, 而且 SELECT 锁一般在 SELECT 完成后即释放
    故一般不建议事务+SELECT+锁所以标记的方法会比较省事, 锁的范围和时间都很小(像我上面取数据的示例根本就没有显式加事务和锁)
      

  14.   

    sql 2005 的话, 取数据的方法会更简单UPDATE TOP(1) A SET
    标记 = N'已取'
    OUTPUT
    inserted.*
    FROM 你的表
    WHERE 标记 = N'未取'