代码之家  ›  专栏  ›  技术社区  ›  Brian Webster

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

  •  0
  • Brian Webster  · 技术社区  · 14 年前

    我正在填充一个充当缓存的表。(这是必需的,因为数据来自链接服务器,而通过链接进行连接的成本太高)

    我在下面加入了伪代码,希望能证明我在做什么。我真的不知道是否有一种方法可以像这样锁定一个表,或者我是否需要使用事务,但是这里有一些基础:

    1. 删除cachetable中的所有内容
    2. 填充cachetable
    3. 在cachetable中处理数据10秒(重要的是,此存储过程的其他实例在处理期间不删除cachetable!)
    4. 返回已处理的结果(cachetable再次可用)

     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]]
    

    如何在处理缓存表时保护该表中的数据?

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Dan D.    14 年前

    cacheTable不是临时表吗,因此存储过程的每个实例都应该分配自己的表,从而避免了锁定问题

        2
  •  1
  •   Mitch Wheat Scott Wisniewski    14 年前

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

    完成后,删除只与guid匹配的行。