帮忙请大家看看 下面这个存储过程(sqlserver2005)。。这个是一个ID种子表。因为多用户操作。当一个用户进行操作的时候锁定该表,别的用户进行排队等待。小弟我知道应该是用lock来解决 可是就是不知道语法应该怎么写
请高手们帮我看看啊。。应该怎么应用于存储过程中啊
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [db_accessadmin].[Up_Bap_GetIDSeed]
@KeyVal varchar(128),
@ReturnID int outputASSELECT @ReturnID = MaxValue + 1 from[db_owner].IDSeed 
WHERE [NAME] = @KeyVal
--SET @ReturnID = MaxValue + 1update [db_owner].IDSeed set MaxValue = @ReturnID
WHERE [NAME] = @KeyVal

解决方案 »

  1.   

    存储过程中可以加事务处理,或者写成下面的比较好一些:update [db_owner].IDSeed set MaxValue = MaxValue + 1, @ReturnID = MaxValue + 1
    WHERE [NAME] = @KeyVal这样只需要一条update语句即可,就是一个独立事务了。
      

  2.   

    把这两句话的先后次序换一下,不lock也没有问题了update [db_owner].IDSeed set MaxValue = MaxValue + 1
    WHERE [NAME] = @KeyValSELECT @ReturnID = MaxValue from[db_owner].IDSeed 
    WHERE [NAME] = @KeyVal
    --SET @ReturnID = MaxValue + 1
      

  3.   

    锁定整个表可以这样
    SET XACT_ABORT  ON
    begin tran
    SELECT @ReturnID = MaxValue + 1 from[db_owner].IDSeed with(tablockx)
    WHERE [NAME] = @KeyVal
    --SET @ReturnID = MaxValue + 1update [db_owner].IDSeed set MaxValue = @ReturnID
    WHERE [NAME] = @KeyValcommit tran