我有一个比较重要的存储过程,对一个表进行更新,我不希望多个用户同时运行它。
如果办?或者,不能同时运行该存储过程中的一段SQL,如何办

解决方案 »

  1.   

    可以先建立一个表,表中只有一个字段,默认为0,然后在存储过程中先写IF SELECT * FROM TABLE WHERE COL=0 BEGIN UPDATE TABLE SET COL=1 ..........  ELSE RETURN  然后执行完再将COL改成0 这样就可以了,若别的用户运行此存储过程 ,会先看COL是否为1,若是1则RETURN,否则就执行,执行完后又把COL改成0,这样别的用户就可以继续运行了.
      

  2.   

    谢谢。我是想对一段SQL上锁,行不行?
      

  3.   

    那加锁只能对表,可以加各种锁.恩,你的也可以设置事务状态为 SET SERIELIZEBLE ,然后在其中的语句都会以高隔离级别进行加锁,而不是系统默认的标准级别
      

  4.   

    是不是不想多个用户同时更新某一行么?
    看看下面的例子:CREATE TABLE Test(A int identity(1,1),B int)
    INSERT INTO Test(B) Values()
    INSERT INTO Test(B) Values(2)ALTER Proc pUpdate
    @i int
    ASUPDATE T
    SET B = 9999 
    FROM 
    (
    SELECT * FROM TEST WITH (READPAST,ROWLOCK) WHERE A = @i
    ) T=====================================================在一个Connection里执行:
    BEGIN TRAN
    Exec pUpdate 1
    另外一个Connection里执行:
    Exec pUpdate 1   ==0行被更新
    Exec pUpdate 2   ==1行被更新不知道能不能满足你的需求!
      

  5.   

    用事务也可以,当一个用户在执行这个存储过程的时候,其它用户就会处于等待状态。
    begin translation aa
    rollback translation aa
    commit translation aa
      

  6.   

    lzhs(快乐至上):你的代码太复杂了。不过还是要谢谢你。tanweibiao2000(延平):
    你说的事务是指在存储过程的外部进行还是存储过程的内部?现在我的存储过程中,都是用事务的,这样其他用户在执行这个存储过程时就要因事务而等待,是吗?