如何在不取消新调用的情况下锁定存储过程

马哈茂德·法赫里(Mahmoud Fakhry)|

我有一个存储过程,该存储过程每分钟都会从作业中调用一次,但是它也可以在作业外部随时调用。

如果我在作业调用存储过程的同时调用了存储过程,就会出现问题。

我需要的是让第二个呼叫等到第一个呼叫完成,然后再开始第二个呼叫。

我按照此链接使用sp_getapplock。

注意:我尝试了sp_getapplock,但它取消了第二个调用。

更新:这是我正在使用的示例

ALTER PROCEDURE TestingLocking
AS  
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    DECLARE @returnCode INT, @DriverID INT, @OrderID int, @CarTypeID int

    EXEC @returnCode = sp_getapplock
            @Resource = 'TestingLocking',
            @LockMode = 'Exclusive',
            @LockOwner = 'Session',
            @LockTimeout = 5,
            @DbPrincipal  = 'public'

    DECLARE db_cursor CURSOR FOR 
        SELECT top 5 OrderID, CarTypeID FROM Orders

    OPEN db_cursor   
        FETCH NEXT FROM db_cursor INTO @OrderID, @CarTypeID
        WHILE @@FETCH_STATUS = 0 
    BEGIN
        --Update Orders Set DriverID = @DriverID WHERE OrderID = @OrderID
    WAITFOR DELAY '00:00:02';
        --INSERT INTO Logs(OrderID,DriverID) Values(@OrderID,@DriverID)

        FETCH NEXT FROM db_cursor INTO @OrderID, @CarTypeID
    END
    CLOSE db_cursor
    DEALLOCATE db_cursor

    EXEC @returnCode = sp_releaseapplock
                        @Resource = 'TestingLocking',                       
                        @LockOwner = 'Session',
                        @DbPrincipal  = 'public'

END
GO

当我从两个SSMS实例执行存储时,第二个实例引发错误

无法释放应用程序锁(数据库主体:“ public”,资源:“ TestingLocking”),因为当前未持有该锁。

TT。

您指定的锁定超时为5毫秒,因此,当然,当已经持有该锁定的第二个尝试获取该锁定的进程几乎会立即失败。

如果要无限期等待,请指定-1为锁定超时。或者,指定一个合理的超时值(请记住,该参数@LockTimeout以毫秒为单位)。


其次,您无需sp_getapplock在statement之后验证对的调用的返回值EXEC @returnCode = sp_getapplock ...如果获取锁失败,则不应释放锁。您应该从存储过程或作业中返回。检查文档中可能的错误代码

Value   Result
---------------------------------------------------------------------------------------------------
0       The lock was successfully granted synchronously.
1       The lock was granted successfully after waiting for other incompatible locks to be released.
-1      The lock request timed out.
-2      The lock request was canceled.
-3      The lock request was chosen as a deadlock victim.
-999    Indicates a parameter validation or other call error.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不锁定表的情况下向Postgres中的ENUM添加新值?

如何在不取消API调用的情况下使用axios设置超时?

如何在不排序的情况下取消堆叠?

在C#中调用的存储过程如何在不提供所有可选参数的情况下正确插入数据?

如何在不使用过程名称作为字符串的情况下使用存储库模式调用存储过程

Pyomo:如何在不声明名称的情况下创建新的模型变量,然后将其存储在字典中?

在不阻止终端的情况下开始新的过程

loadrunner-如何在不锁定我的userId的情况下重播和调试脚本

18.04: 如何在不暂停机器的情况下锁定我的屏幕?

如何在不锁定 UI 的情况下从 MySQLite 进行 SELECT?

如何在不编写新函数的情况下从另一个文件调用变量

如何在不获取新 PID 的情况下从 multiprocessing.Process 调用主进程中的方法?

此Go代码如何在不取消引用的情况下通过指针设置对象的值?

如何在不取消引用的情况下确定指向数据的大小?

如何在不取消选择注释的情况下更新标注视图?

如何在不丢失这些类型的情况下取消列出混合类型列表?

如何在不取消引用指针的情况下返回指针的指针值?

如何在不更改 Git 的情况下取消暂存文件?

如何在不终止执行此操作的线程的情况下取消文件上载/下载操作?

如何在R中不包含前缀的情况下取消列出嵌套命名列表?

Perl:如何在不创建数组副本的情况下取消引用数组?

如何在不破坏链接的情况下取消链接到自身的文件

如何在不创建存储过程的情况下在oracle中实现以下目标?

如何在不声明所有参数的情况下在 mySQL 中创建存储过程?

Netezza-如何在没有REFTABLE的情况下从存储过程返回多个值

如何在不使用autosys更改日期参数的情况下运行存储过程

如何在不删除现有过程的情况下向程序包添加新过程/功能?

如何在不添加远程的情况下将提交推送到 git 存储库?

如何在不创建表的情况下将动态查询的结果存储在临时表中?