一个序号表中有100000个不同的id
有10个同样的程序(exe)同时运行,每个程序每次取10个序号,取了之后就更新数据库做flag标记,表明已取了,怎样保证每个程序每次取的号都是不相同的
我的想法:
1。读了就锁  那能更新吗
2。若读了之后就解锁,那在更新之前另一个程序又读了此程序刚获取的号,则乱了还有更好且有实践经验的方法吗?

解决方案 »

  1.   

    用FileMaping存已读id not (id in arr)
      

  2.   

    //1.10个程序同时运行,并且要保证同时获取的ID不一致,那就要用READPAST锁!
    //2.查询后要进行ID的更新,这时对于整个表已经加上UPDLOCK(这个锁应该是等到事务完毕后才自动释放),所以当一个程序在更新完毕数据后,没有提交事务,其它的事务只能处于阻塞状态。也就是更新操作的串行化。但可以放心,这时10个程序同时取的ID肯定是不一样的。//1.模拟生成一些数据
    USE tempdb
    GO
    CREATE TABLE dbo.tb(
    id int identity(1, 1),
    name nvarchar(128), 
    Flag INT)INSERT tb(name)SELECT TOP 10000 a.name
    FROM syscolumns a full join syscolumns b
    on a.name=b.name
    GO
    2.--测试<一个应用程序可以代表一个事务,一个事务在查询分析器上代表一个查询窗口> BEGIN TRANUPDATE tb
    SET FLAG=1
    WHERE ID IN (
    SELECT TOP 10 ID  FROM tb WITH(READPAST)
    )commit TRAN
      

  3.   

    To:liangpei2008
    你的分析是比较靠谱的,不过,关键是第一条时READPAST锁会不会真的能起来预期作用,能不能给我多讲一下READPAST锁的作用,谢谢
      

  4.   

    Begin Trans
      select Top 10 ID from tb with(xlock,paglock)   where Flag=0
      Update tb set Flag=1 where ID in(select Top 10 ID from tb where Flag=0)
    Commit Trans
      

  5.   

    To goodhj
    你说得对,
    但with(xlock,paglock)和WITH(READPAST)
    什么区别,实际用时哪个更可靠?