如何从两个数据库中使用 SQL Server 中的应用程序锁

owl*_*owl 3 sql-server locking

如何使用来自两个不同数据库的锁。当一个会话获取锁时,没有什么可以阻止不同的会话从不同的数据库获取相同的锁。

第一节:

USE db_one;
EXEC @lock_result = sp_getapplock @Resource = 'my_resource',
                                  @LockMode = 'Exclusive',
                                  @LockTimeout = 30000;
Run Code Online (Sandbox Code Playgroud)

第二场:

USE db_two;
EXEC @lock_result = sp_getapplock @Resource = 'my_resource',
                                  @LockMode = 'Exclusive',
                                  @LockTimeout = 30000;
Run Code Online (Sandbox Code Playgroud)

第二个会话立即获取锁,而不是等待锁。现在两个会话似乎同时拥有相同的锁。

Dan*_*man 9

考虑数据库限定sp_getapplockproc 名称。这样,锁将在指定的数据库而不是当前会话数据库上下文中获取。

EXEC @lock_result = tempdb..sp_getapplock @Resource = 'my_resource',
    LockMode = 'Exclusive',
    @LockTimeout = 30000;
Run Code Online (Sandbox Code Playgroud)


Cha*_*ace 6

您可以将它放在一个数据库中的存储过程中,然后通过跨数据库调用执行它。

USE db_one;
GO

CREATE PROC dbo.LockMy_resource
AS

DECLARE @lock_result int;
EXEC @lock_result = sp_getapplock @Resource = 'my_resource',
                                  @LockMode = 'Exclusive',
                                  @LockTimeout = 30000;
RETURN @lock_result;

GO
Run Code Online (Sandbox Code Playgroud)
USE db_two;
GO

DECLARE @lock_result int;

EXEC @lock_result = db_one.dbo.LockMy_resource;
Run Code Online (Sandbox Code Playgroud)