您好我想阻止多个用户同时更新表。
在表"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
答案 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'
告诉只要事务正在运行就持有锁,所以你实际上不需要打扰释放锁