我正在填充一个充当缓存的表。 (这是必需的,因为数据来自链接服务器并且通过链接加入太昂贵了)
我在下面包含伪代码,希望能够证明我正在尝试做什么。我真的不知道是否有办法像这样锁定一个表,或者我是否需要使用事务,但这是基础知识:
delete from CacheTable -- If this errors because it is locked, exit stored procedure
[[Lock CacheTable]]
insert into CacheTable
exec RemoteDB.dbo.[sp_GrabRecords] @Start, @End, @Key
Process Cached Data
...
Select Processed Data
[[Unlock CacheTable]]
如何在处理CacheTable时保护数据?
注意:我也在寻找其他选择。我尝试使用表变量,但它太慢了,可能是因为它没有主键。甚至不确定表变量是否可以有主键。我只知道上面的方法非常快,但它有碰撞问题,显然
答案 0 :(得分:1)
将GUID(uniqueidentifier
)列添加到缓存表中。让存储过程的每个执行实例创建一个新的GUID(NEWID()
),以便在缓存表中唯一标识它的行。这样您就不需要锁定其他正在运行的实例。
完成后,删除仅与GUID匹配的行。
答案 1 :(得分:1)
不是CacheTable的临时表,所以存储过程的每个实例都应该分配它自己的;从而避免锁定问题