现有一个表,假设主键字段为BookID,它需要保持唯一性,但不知道是不是有比较好的方法?
我是想每次在保存前取表记录中BOOKID的最大号加1,但是现在有大约800个用户在不停的向这个表中插入记录,每插一条的bookID 都是取最大号加一,但是因为用户都同时在插入记录,想知道如何能使用记录顺利保存,而不返回‘违反约束。’等字样,并且不想后客户端弹出对话框让用户重新保存或重试?

解决方案 »

  1.   

    MS SQL SERVER 2000:
    如果只是本表唯一,用IDENTITY屬性定義該列,如果要在整個數據庫唯一,用ROWGUIDCOL屬性
      

  2.   

    如果用identity属性,在我插入记录后,如何取得刚才插入的记录的identity值
      

  3.   

    to madbo
    楼上说的我不太明白,能否详细说说。
    我的实际情况是这样,我的表中有一个字段是blob字段,一般可能保存文件的大小为10M以下,我现在的做法是先把非blob字段的值保存到数据库,接着再对这条记录编辑,把blob字段的内容保存到数据库中,你说的方法对这的要求可行不?
      

  4.   

    楼主的程序由服务器端吗?还是客户端自己往SQL2000里添数据?
      

  5.   

    我的程序是cs结构的,数据服务端为oracle
    客户端大约1000多台pc,同时使用的用户大约800多
    用户从客户端向oracle中插入数据
      

  6.   

    为了防止并发访问,自己作一个Server为客户端的请求排序吧,像madbo(风轻扬)说得那样
            Oracle
              |
            Server
             |||
           __ | _____
          |   |      |
    Client1 Client2 Client3...
      

  7.   

    明白谢谢
    请问oracle中的行锁如何解锁?用什么命令?
      

  8.   

    $%%@#$^&*&&^*$
    呵呵,Oracle俺不会
      

  9.   

    如果用加锁,那么应该怎么做,象下面这样吗
    lock table mytable in row mode
    insert .........
    commit
      

  10.   

    commit相当于解锁,是吗?
    commit后就自动解锁刚才锁住的行吗
      

  11.   

    to 楼主:
    呵呵,报歉,昨天贪睡了点,看来我提的建议您已经理解了。
    oracle俺还没研究过,帮不上更大的忙了,深表遗憾……to OverlordBlind(OverlordBlind)谢谢兄弟画图解说,还请多多指教!
      

  12.   

    谢谢大家,在oracle中,我刚才启动了两个sql plus worksheet,为说明方便,我们分别给它们叫做A sqlplus,B sqlplus
    第一步:A,B都运行下面语句
    insert into tbl_book(bookid, bookname) values(bid.nextval, 'bookname');
    select bid.currval from dual;
    commit;
    运行完之后A的currval当前值为100,B的currval当前值为101
    第二步:
    A的语句保持不变
    B的语句删除insert语句即变为select bid.currval from dual;
    第三步:
    先执行A中的语句,currval的前变为102
    再执行B中的语句,currval的值还是101
    为什么为什么B中的currval值不是102