防止多个用户同时运行相同的SQL Server存储过程

时间:2016-03-24 10:43:14

标签: sql sql-server

您好我想阻止多个用户同时更新表。

在表"abc"中需要更新数据库"abd.dbo.xyz"。我是SQL的新手,但是我编写的代码还没有满足我的要求。

有任何帮助吗?

use [abc]
BEGIN TRANSACTION 
DECLARE @res INT
EXEC @res = sp_getapplock
@Resource = 'This a Lock ID',
@LockMode = 'Exclusive',
@LockOwner = 'Transaction',
@LockTimeout = 15000,

IF @res NOT IN (0, 1)
BEGIN
    RAISERROR ( 'Unable to acquire Lock', 16, 1 )
END
ELSE
BEGIN

-- this is update command which i need to run one instance only
Update abc.dbo.xyz set IsKeyProduct= NULL Where IsKeyProduct is not NULL;

EXEC @res = sp_releaseapplock
@Resource = 'This a Lock ID', 
@DbPrincipal = 'public', 
@LockOwner = 'Transaction'

END 
COMMIT

1 个答案:

答案 0 :(得分:1)

您正在检查结果是否在(0,1)中,而1表示该过程必须等待释放锁定。如果仅检查(0),则表示立即授予锁定(因此没有其他proc的实例被运行)

最简单的方法是在存储过程中使用 sp_getapplock

Exec @lokcResult =sp_getapplock @Resource='MyLock', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout = 500

在您检查@lockResult之后,如果它不等于0,您应该返回而不做任何事情。 请参阅getapplock文档:https://msdn.microsoft.com/en-us/library/ms189823.aspx

@LockOwner='Transaction'告诉只要事务正在运行就持有锁,所以你实际上不需要打扰释放锁