【发布时间】:2011-03-17 16:25:40
【问题描述】:
我有以下 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
我正在使用带有注释的“锁定”hack 来获取排他锁。
注意:使用 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
有没有更好的方法来获取事务范围的独占锁而无需此类黑客攻击?
【问题讨论】:
-
不完全确定您要做什么。这是你需要的吗? sqlteam.com/article/…
标签: sql sql-server transactions locking isolation-level