SQL Server初学!!
用select isnull(max(PlanID),0)+1 as PlanID from T_Plan_Main
查出这表里面最大的那个PlanID,用这个PlanID作为关键字将数据插入近表中但是用户多了以后,在我算出最大的PlanID之后别的用户先在这个里面插入PlanID的数据,再往里面插就插不进去了,
也是查出最大编号,和按这个最大编号插入数据,中间有并发错误,请问如何解决,谢谢

解决方案 »

  1.   

    可以使用xlock锁来控制并发操作时生成的PlanID不相同:
    create proc spMaxID
    as
    begin transaction      /*启动事务*/
    declare @MaxID int
    --使用holdlock使锁保持到事务结束,xlock保证事务期间禁止其他用户读取,防止生成相同的PlanID.
    select @MaxID = isnull(max(PlanID),0)+1 as PlanID from T_Plan_Main with (holdlock,xlock)
    --插入最大值
    insert into T_Plan_Main(PlanID) values(@MaxID)
    commit transaction    /*提交事务,同时自动解锁,以保证其他用户生成新的PlanID*/
    GO