首先,这个问题需要研究你的原始需求,其实为什么要写个这样的存储过程呢?应该有更好的方案可以满足你的需要。其次,如果你还是要这样写,事务隔离级别将会使用:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ,
这样的话并发性是很差。

解决方案 »

  1.   

    我写了个存储过程gerNumber,该存储过程先获取表id的最大值,然后计算出一个编号,在数据量很大或者并并发很大的时候就会有问题, 
    暂时还没有碰到,但是肯定会发生的,请问这样的并发应该怎么样避免, 
    我的方法是锁住表,或者用事务隔离级别(但是不知道那个级别才适合),
    ===========================
    最好不要取id的最大值,这样会出现很多隐藏问题
    最好是用IDENTITY.如果是为了解决并发问题,那么可以采取时间戳的办法,很容易搞定最好别锁表,锁来锁去越锁越乱.
      

  2.   

    换种方式可能会好一点,如增一个张表专门用来存放ID
    Table: TableID
    -------------------------
    TABLE_NAME         Max_ID
    '表1'              100001
    '表2'              100222再写一个函数
    CREATE FUNC GET_ID(table_name varchar(16)) 
    returns int
    asdeclare 
      @ID int;UPDATE TableID SET = Max_ID + 1  WHERE TABLE_NAME = '表1'
    SELECT @ID = Max_ID  FROM TableID WHERE TABLE_NAME = '表1'RETURN @ID
      

  3.   

    我是这样测试的,在控制台调用存储过程addPointByGame,用1000到50000个线程测试,每隔1毫秒执行,有很多编号重复了,但是都执行成功了
    然后修改存储过程addPointByGame,也就是上面我贴出来的,用用1000到50000个线程测试,每隔1毫秒执行,没有编号重复,但是不会全部都执行成功
    比如1000个就有13个执行失败,10000个就有300多个失败,这样的数据量还算可以吗,
    因为用了悲观锁,所有有并发的话就执行失败,这样的数据量不知道行不行,感觉失败的有点多