Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何获取独占锁以防止竞争条件?_Sql_Sql Server_Transactions_Locking_Isolation Level - Fatal编程技术网

SQL Server:如何获取独占锁以防止竞争条件?

SQL Server:如何获取独占锁以防止竞争条件?,sql,sql-server,transactions,locking,isolation-level,Sql,Sql Server,Transactions,Locking,Isolation Level,我有以下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

我有以下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
我正在使用带有注释标记的“锁定”黑客来获取独占锁

注意:使用TabLox或UPDROK提示将不起作用,因为我已经通过拆分语句和在中间添加WAITO命令来破坏原子性,用于测试目的。 我不想要这样的东西:

INSERT INTO debugSP (DateCreated, ClientId, Result)
SELECT GETDATE(), @@SPID, COUNT(*) 
FROM debugSP
这是同时运行两个会话(带锁表)后的正确结果

这是在lock被注释掉的情况下运行代码的错误结果

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

有没有更好的方法来获取事务范围的独占锁而不受此类黑客攻击?

我不太清楚您想从发布的代码中做什么。我想你只是想序列化对那段代码的访问?如果是这样的话,
sp_getapplock
应该做您需要做的事情,而不是创建一个新的虚拟表,您只需要使用它来锁定


您可以在具有可重复读取隔离的事务范围内对(XLOCK,ROWLOCK)使用锁定提示。在Serializable isolation(可序列化隔离)下,在读取操作上默认获得排他锁,因此如果您需要一个特定的事务来并行运行,那么您可以在创建该事务时为该事务指定一个更高的序列化级别(您正在这样做;这不是一个黑客行为,只是根据具体情况执行的方式).

不太清楚您想做什么。这是你需要的吗?
Id DateCreated           ClientId Result
-- ----------------------- -------- ------
 1 2011-03-17 15:52:43.128       66      0
 2 2011-03-17 15:52:46.341       68      0