OS:win7 or windows2003
DB:sql2008R2
 create table sybh --所有编号
 (bh varchar(10) null defautl '',
  mc varchar(20) null default '') create table ysybh --已使用编号
  (bh varchar(10) null defautl '',
   mc varchar(20) null default '') 表sybh中有2000条数据、ysybh中有600条数据,现在需要在sybh中检索出一个编号,此编号不存在于ysybh中
 检索的方法为
 
 
  select top 1 a.bh from sybh a where not exists (select bh from ysybh b where a.bh=b.bh)
 
  
 但是假设有1000个人同时在检索编号 如何能杜绝这1000人同时检索时不会检索出相同的编号来。

解决方案 »

  1.   

    在说明一下:  当第一个人检索出来的编号后会自动将检索出来的编号保存入 ysybh 表中
      

  2.   

    在用之后select top 1 a.bh from sybh a where not exists (select bh from ysybh b where a.bh=b.bh)
    把a.bh插到 ysybh 表中,再用一个字段标记起来(表示临时,没有人用的话再回收)。
    方法是笨了点。
    好像用lock是解决不了的。
      

  3.   

    楼主现有的设计不太合理,建议稍稍改一下,以下两种方法都可以达到楼主的要求(不需要使用锁):--方法1、在sybh表中增加一个表示是否已使用的列
    ALTER TABLE sybh ADD IsUsed BIT DEFAULT 0--每次调用下面的过程即可CREATE TABLE #bh(bh VARCHAR(10), mc VARCHAR(20)) WHILE 1=1
    BEGIN
    UPDATE TOP (1) sybh 
    SET IsUsed = 1
    OUTPUT deleted.bh,deleted.mc INTO #bh
    WHERE IsUsed = 0

    IF @@ROWCOUNT = 1
    BEGIN
    INSERT INTO ysybh(bh,mc) SELECT bh,mc FROM #bh
    BREAK
    END
    END--#bh表中就是检索出来的编号
    SELECT * FROM #bhDROP TABLE #bh
    --方法2、增加一个未使用编号的表--之后的方法与方法1类似,只不过将UPDATE改成DELETE即可
      

  4.   

    其实,如果使用方法1的话,ysybh表就有些多余了,没有这个表更好。