我有以下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
没有这样的黑客,有没有更好的方法来获取交易范围内的排他锁?
我不确定从发布的代码中您要做什么。我想您只是在尝试序列化对那段代码的访问?如果是这样,sp_getapplock则应执行所需的操作,而不是创建仅用于锁定的新虚拟表。
sp_getapplock
详情在这里