小编典典

SQL Server:如何获取排他锁以防止出现竞争状况?

sql

我有以下T-SQL代码:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION T1_Test

    /*This is a dummy table used for "locking" 
    and it doesn't contain any meaningful data.*/        
    UPDATE lockTable 
        SET ID = 1    
        WHERE ID = 1

    DECLARE @Count TINYINT

    SELECT @Count = COUNT(*)
    FROM debugSP

    WAITFOR DELAY '00:00:5';

    INSERT INTO debugSP 
        (DateCreated, ClientId, Result)
    SELECT 
        GETDATE(), @@SPID, @Count

COMMIT TRANSACTION T1_Test

我正在使用带有注释的“锁定”黑客来获取排他锁定。

注意:使用TABLOCKX或UPDLOCK提示将不起作用,因为我通过拆分语句并在中间添加WAITFOR命令进行测试而破坏了ATOMIC-
ity。我不要这样的东西:

INSERT INTO debugSP (DateCreated, ClientId, Result)
SELECT GETDATE(), @@SPID, COUNT(*) 
FROM debugSP

在同时运行两个会话(带锁表)之后,这是正确的结果

Id DateCreated           ClientId Result
-- ----------------------- -------- ------
 1 2011-03-17 15:52:12.287       66      0
 2 2011-03-17 15:52:24.534       68      1

那是运行带有注释的代码的不正确结果

Id DateCreated           ClientId Result
-- ----------------------- -------- ------
 1 2011-03-17 15:52:43.128       66      0
 2 2011-03-17 15:52:46.341       68      0

没有这样的黑客,有没有更好的方法来获取交易范围内的排他锁?


阅读 210

收藏
2021-04-07

共1个答案

小编典典

我不确定从发布的代码中您要做什么。我想您只是在尝试序列化对那段代码的访问?如果是这样,sp_getapplock则应执行所需的操作,而不是创建仅用于锁定的新虚拟表。

详情在这里

2021-04-07