SP_GetAppLock为什么不立即返回控件?
当我的应用程序中的两个用户运行以下过程时:
CREATE PROCEDURE [dbo].[CopyForm](@varId as uniqueidentifier)
AS
BEGIN
DECLARE @returnLock INT
BEGIN try
EXEC @returnLock = Sp_getapplock
@Resource = 'CopyFormLock',
@LockMode = 'Exclusive',
@LockOwner = 'Session'
IF @returnLock <> 0
BEGIN
RAISERROR (
'the operation is occupied by another user, wait a few minutes',
16,1
)
RETURN
END
--do stuff
EXEC @returnLock = Sp_releaseapplock
@Resource = 'CopyFormLock',
@LockOwner = 'Session'
END try
BEGIN catch
IF @returnLock = 0
BEGIN
EXEC @returnLock = Sp_releaseapplock
@Resource = 'CopyFormLock',
@LockOwner = 'Session'
END
END catch
END
GO
第一个锁定该过程的用户执行该过程,然后解锁它。第二个用户等待,仅在第一个用户删除锁之后,第二用户才会出现错误:“操作由另一个用户占用,等待几分钟”。 我不明白为什么第二个用户不会立即输出错误,我必须等待第一个错误。 解释我在哪里犯了一个错误,以及如何立即显示错误?
When two users in my application run the following procedure:
CREATE PROCEDURE [dbo].[CopyForm](@varId as uniqueidentifier)
AS
BEGIN
DECLARE @returnLock INT
BEGIN try
EXEC @returnLock = Sp_getapplock
@Resource = 'CopyFormLock',
@LockMode = 'Exclusive',
@LockOwner = 'Session'
IF @returnLock <> 0
BEGIN
RAISERROR (
'the operation is occupied by another user, wait a few minutes',
16,1
)
RETURN
END
--do stuff
EXEC @returnLock = Sp_releaseapplock
@Resource = 'CopyFormLock',
@LockOwner = 'Session'
END try
BEGIN catch
IF @returnLock = 0
BEGIN
EXEC @returnLock = Sp_releaseapplock
@Resource = 'CopyFormLock',
@LockOwner = 'Session'
END
END catch
END
GO
The first user who locks the procedure executes it and then unlocks it. The second user waits and only after the first user removes the lock, the second user gets the error "the operation is occupied by another user, wait a few minutes".
I do not understand why the error is not output for the second user immediately, and I have to wait for the first one.
Explain plz where I made a mistake, and how to make the error be displayed immediately?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您在这里有许多问题:
sp_getapplock
的结果始终小于失败中的0。如果等于1
,则意味着必须等待。@locktimeout = 0
。投掷
而不是raiserror
。You have a number of issues here:
sp_getapplock
is always less than 0 in a failure. If it is equal to1
then it just means it had to wait.@LockTimeout = 0
.THROW
instead ofRAISERROR
.