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)
第二个会话立即获取锁,而不是等待锁。现在两个会话似乎同时拥有相同的锁。
考虑数据库限定sp_getapplockproc 名称。这样,锁将在指定的数据库而不是当前会话数据库上下文中获取。
EXEC @lock_result = tempdb..sp_getapplock @Resource = 'my_resource',
LockMode = 'Exclusive',
@LockTimeout = 30000;
Run Code Online (Sandbox Code Playgroud)
您可以将它放在一个数据库中的存储过程中,然后通过跨数据库调用执行它。
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)
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |