我有以下 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 命令来破坏原子性以进行测试。我不想要这样的东西:
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
有没有更好的方法来获取事务范围的独占锁而没有这种黑客攻击?