获取编号的时候"select isnull(max(cast(cls_num as int)),1000000)+1 as newid from  classes"获取最大编号并自动加一。保存时保存该编号
如果另一个用户也获取到这个编号,也保存相同编号就会冲突。
我不想加锁和用事务回滚,这样都造成用户不能保存数据。我想这样:保存时,如果有相同编号,就把这个编号再加一,如果还有相同就再加一,直到保存成功。大家知不知道怎样实现?

解决方案 »

  1.   

    lz那样做肯定不行,如果加1了还是不行呢?你这样做只会加重出现重复的几率,导致一个更恶劣的结果。建议你用一张表来专门做流水号的处理,如果你是多台机器的话,然后用一条记录来作为某个需要流水号的功能的流水号计算记录。
    然后对这条记录进行行锁就可以避免出现重复的问题了如果流水号不包含特殊的意义,就使用自增量字段好了,用bigint,保证不会超出最大值。用int型做关键字,查询、插入速度也快。
      

  2.   

    通过抛异常的方式来处理程序是很不好的!而且从你的情况来看,在并发高的时候,出现重复的几率比较高,如果通过抛异常来处理,效率会很低的。另外如果你的程序只在一台机器的一个进程里,你可以加上代码的lock来保证获取编号的唯一性。
      

  3.   

    oracle 可以用sequence.mssql就不晓得了.