我有以下 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
有没有更好的方法来获取事务范围的独占锁而不需要这样的黑客攻击?