sql - 当存储过程没有输入参数时 sp_getapplock 正在工作
问题描述
我一直在使用它sp_getapplock
来锁定资源的会话。
这是存储过程:
CREATE PROCEDURE [dbo].[system-LockProcedure]
@procname VARCHAR(200)
AS
--BEGIN TRAN
BEGIN
DECLARE @lockreturn INT,
@lockresource VARCHAR(200) -- sysname
SELECT
@lockresource = @procname
-- The below line will try to acquire an exclusive lock on the PROC for the session, if the proc is already in execution the @lockreturn value will be > 0
EXEC @lockreturn = sp_getapplock @lockresource,
@LockMode = 'Exclusive',
@LockOwner = 'Session',
@LockTimeout = 100
PRINT @lockreturn
IF @lockreturn <> 0
BEGIN
RAISERROR ('Another instance of the procedure is already running', 16, 1)
RETURN
END
-- The Code to be executed goes here. All the core logic of the proc goes here..
PRINT 'Procedure execution started for user: ' + CAST(CURRENT_USER AS NVARCHAR(20)) + ' for session: ' + CAST(@@SPID AS NVARCHAR(10))
-- This is just to make the system wait for 30 seconds and make sure if there is any concurrent execution triggered will fail
EXEC @lockresource
PRINT 'Procedure execution ended for user: ' + CAST(CURRENT_USER AS NVARCHAR(20)) + ' for session: ' + CAST(@@SPID AS NVARCHAR(10))
PRINT @lockreturn
-- This is to release the lock once the stored procedure has run completely
EXEC sp_releaseapplock @lockresource , 'Session'
-- END TRY
END
我们也可以在您的本地执行此程序进行测试。
当我在一个会话中执行该过程时,如果有人想要执行这个存储过程,那么它会显示它已经在另一个会话中打开的消息。
使用资源名称执行此过程时,该资源名称也是过程对象
EXEC dbo.[system-LockProcedure]'dbo.usp_Test1'
它工作正常
EXEC dbo.[system-LockProcedure]'dbo.usp_Test2'
有输入参数并且它要求输入参数
错误:
消息 201,级别 16,状态 4,过程 USP_Test2,第 23 行
过程或函数“USP_Test2”需要未提供的参数“@ThreadID”。
解决方案
推荐阅读
- alfresco - 如何为 Alfresco 共享属性页面中的必填字段创建自定义工具提示?
- android - Android 重复库 - com.google.android.gms.internal.measurement.zzfs
- flutter - 在 Flutter 中显示用户友好的错误页面而不是异常
- java - Firebase 查询似乎在 andorid 中不起作用
- java - 在 selenium 中使用 Microsoft Outlook 发送电子邮件的 Java 程序抛出“javax.mail.MessagingException:”
- c# - 寻找一种方法来保存用户进度 c# 表单
- java - 当我们在集合中使用 for-each 结构进行迭代时,元素的顺序是什么?
- mysql - 运行“sudo find / -iname 'mysql*' -exec rm -rf {} \;”后是否可以恢复 Ubuntu 16.04 并安装 mysql?
- flask - 如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证
- entity-framework - Entity Framework Plus - foreach 循环中的 FutureValue()