考虑以下情况:
公司中的某些用户可能会读取和更新数据库中的客户数据(来自前端应用程序)。
为避免同一客户重复更新,如果用户A开始修改特定客户的数据,则在用户A完成并更新数据库之前,没有人可以修改该客户的数据(用户A持有该客户数据的排他锁)。
如果另一个用户尝试修改相同的客户数据,系统将立即返回错误信息,表明用户 A 已经在修改该客户的数据。
对于这样的需求,我想在用户 A 开始编辑客户数据时sp_getapplock
使用名称作为唯一客户 ID授予排他锁。然后当另一个用户尝试编辑时,系统将返回无法授予锁定,因为用户 A 持有它。
以下是我预期的 SQL:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
DECLARE @result INT
EXEC @result = sp_getapplock
@Resource = 'UniqueCustomerID', @LockMode = 'Exclusive', @LockTimeout = 0
IF @result = 0
--Successful grant the lock, perform the data update action here
ELSE
--The lock is holding by someone, return the SPID who holds the lock
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
如何检索持有锁的 SPID?我知道sys.sysprocesses
并且sp_who
可以通过SPID获取 …