可能刚才说的不是很清楚,很多人误会了
我所说的订单号是如“JINHUO20090716001”这种形式的,下一条就是“JINHUO20090716002”
必须这种,如果是那种自增的我就不需要问了!
也可以这么问。有个字段a是某种东西的库存,整数型,每次进货,都要(a+进货数量),如果有几个人同时进货,会不会出现并发问题呢?应该怎么解决?
我问的是并发问题

解决方案 »

  1.   

    省事的办法就是先insert,再update,写再存储过程里就行
      

  2.   

    假设你要的格式是a**** (*表示数值,它的长度根据你的情况定)
    begin
    declare @strA varchar(10)=''set @strA = a     --a 可以根据你的需要去定义。set @strA = @strA + (select convert(varchar(4),isnull(max(right(dingdan,4)+1,'0001')) from table where dingdan like @strA+'%')
    insert 语句end
      

  3.   

    楼主知道timestamp这种数据类型的字段怎么用么? 如果知道,这种并发的问题就解决了。
    一个单号如果同时有多个人读了,每个人加1后都想存下去,那么这时候只能有一个人存了啊。方法是在表中加一个timestamp字段,无论是谁在读取记录时都要把这个字段的值也读出去,然后在存盘的时候去判断这个字段的值是否已改变,没有变就存下去;变了就要重新去生成单号.
    timestamp类型是一个时间戳,每当一条记录被新增或修改时它的值就会自动改变。一般用这个来控制并发。
      

  4.   

    以下为从数据库取最大单号max_no和此记录的时间戳time_stamp:set @the_max_no = isnull((select max_no from max_no_table where field =@field),0)
    set @the_time = convert(int,(select top 1 the_time from max_no_table where field = @field))
    SELECT @the_max_no as max_no, @the_time as time_stamp然后对这个max_no进行加1或者其它什么处理。
    存盘时:begin
    IF convert(int,(select top 1 the_time from max_no where field = @field)) = @time_stamp
        begin
           ---数据插入SQL语句
        END
    ELSE
           ---单号已被人占用时的处理
    end以上是我在实际中的做法,你可以试下。