2010-08-03 12 views
0

我正在填充充當緩存的表。 (這是必要的,因爲該數據來自通過鏈接服務器,並通過鏈接太貴連接)SQL - 如何臨時保護此表中的數據?

我已經包括僞代碼下面有希望證明什麼,我試圖做的。我真的不知道,如果有鎖定一個表下來這樣的方式,或者如果我需要使用事務,但這裏的基本知識:

  1. 在Cache表
  2. 刪除所有內容填充cache表
  3. 過程中Cache表中的數據,持續10秒(這個存儲過程的其他實例不會在處理過程中刪除cache表是很重要的!)
  4. 返回處理結果(cache表再次空閒)

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

我不是在SQL-Server作爲深諳這些天。 CacheTable是否與臨時表相同?爲什麼不能用時間戳名稱創建臨時表? – vol7ron 2010-08-03 23:24:12

+0

我從來沒有使用臨時表,我想這是一個選項。在這個印象中,他們與標準表格沒有多大區別,但是根據Dan的回答,SP的每個實例可能都會得到它自己的臨時表格版本。如果是這樣的話,那麼我的問題就解決了,只是等待一些驗證 – 2010-08-03 23:31:42

回答

1

是不是cache表臨時表,所以要分配它自己的存儲過程的每個實例;從而避免鎖定問題

+0

這不是臨時表。根據你的回答,我想你是在暗示它應該是。存儲過程的每個實例都獲得它自己的臨時表副本?如果是這種情況,我自己解決了我的問題 – 2010-08-03 23:30:23

+0

我證實了SP獲得了他們自己的等價命名臨時表的實例,所以這個解決方案就是我所使用的,儘管答案中的細節水平是欠缺的。 – 2010-08-03 23:48:41

1

添加GUID(uniqueidentifier)列到你的緩存表。讓每個正在執行的存儲過程實例都創建一個新的GUID(NEWID())來唯一標識它在緩存表中的行。這樣你就不需要鎖定其他正在運行的實例。

完成後,僅刪除符合您的GUID的行。

+0

只要GUID字段被索引,這是一個很好的解決方案。我喜歡! – 2010-08-03 23:47:57