SQL - 如何临时保护此表中的数据?

时间:2010-08-03 23:16:35

标签: sql sql-server-2005 sql-server-2008

我正在填充一个充当缓存的表。 (这是必需的,因为数据来自链接服务器并且通过链接加入太昂贵了)

我在下面包含伪代码,希望能够证明我正在尝试做什么。我真的不知道是否有办法像这样锁定一个表,或者我是否需要使用事务,但这是基础知识:

  1. 删除CacheTable中的所有内容
  2. 填充cacheTable
  3. 处理CacheTable中的数据10秒钟(在处理过程中,此存储过程的其他实例不会删除CacheTable,这很重要。)
  4. 返回已处理的结果(CacheTable再次免费)

  5.  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时保护数据?

    注意:我也在寻找其他选择。我尝试使用表变量,但它太慢了,可能是因为它没有主键。甚至不确定表变量是否可以有主键。我只知道上面的方法非常快,但它有碰撞问题,显然

2 个答案:

答案 0 :(得分:1)

将GUID(uniqueidentifier)列添加到缓存表中。让存储过程的每个执行实例创建一个新的GUID(NEWID()),以便在缓存表中唯一标识它的行。这样您就不需要锁定其他正在运行的实例。

完成后,删除仅与GUID匹配的行。

答案 1 :(得分:1)

不是CacheTable的临时表,所以存储过程的每个实例都应该分配它自己的;从而避免锁定问题