如何避免多个用户同时执行一个存储过程或其中的一段SQL
我有一个比较重要的存储过程,对一个表进行更新,我不希望多个用户同时运行它。
如果办?
或者,不能同时运行该存储过程中的一段SQL,如何办
------解决方案--------------------顶!!
------解决方案--------------------可以先建立一个表,表中只有一个字段,默认为0,然后在存储过程中先写IF SELECT * FROM TABLE WHERE COL=0 BEGIN UPDATE TABLE SET COL=1 .......... ELSE RETURN 然后执行完再将COL改成0
这样就可以了,若别的用户运行此存储过程 ,会先看COL是否为1,若是1则RETURN,否则就执行,执行完后又把COL改成0,这样别的用户就可以继续运行了.
------解决方案--------------------那加锁只能对表,可以加各种锁.恩,你的也可以设置事务状态为 SET SERIELIZEBLE ,然后在其中的语句都会以高隔离级别进行加锁,而不是系统默认的标准级别
------解决方案--------------------学习 :)
------解决方案--------------------是不是不想多个用户同时更新某一行么?
看看下面的例子:
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
AS
UPDATE 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行被更新
不知道能不能满足你的需求!
------解决方案--------------------用事务也可以,当一个用户在执行这个存储过程的时候,其它用户就会处于等待状态。
begin translation aa
rollback translation aa
commit translation aa
------解决方案--------------------加锁是一个办法,对字段加标志不是好办法,因为这个标志不太好维护.