2011-12-09 131 views
0

我有一些文件處理功能,它使用數據庫表來確定文件是否已被處理。SQL Server - 鎖定/阻止方案

IF EXISTS (SELECT * FROM FileTable WITH (UPDLOCK, ROWLOCK, HOLDLOCK) 
      WHERE FileName = @FileToProcess) 
BEGIN 
    -- File already processed. 
END 
ELSE 
BEGIN 
    -- Process file. 
END 

我想要的行爲如下: -

  • 只有一個交易應以一次處理一個文件。
  • 同時處理不同的文件。
  • 如果在處理同一文件時嘗試處理同一個文件,那麼該事務將阻塞,直到另一個文件結束。

我非常確定這是可能的,但是我的SQL鎖定知識並不完美!到目前爲止,我的嘗試要麼在上面的示例中包含鎖定提示,這會導致子彈點2失敗。我嘗試過的所有其他鎖定提示都導致子彈點3失敗。

我錯過了什麼?

+0

[SQL的可能重複服務器進程隊列爭用條件](http://stackoverflow.com/questions/939831/sql-server-process-queue-race-condition) – gbn

回答

0

嘗試增加READPAST允許2點

你可能會在this article

+0

不幸的是,READPAST提示不能與HOLDLOCK提示一起使用,如果我刪除HOLDLOCK提示它突破第3點。 – user1085351

+0

優秀的文章。你可能想在你的回答中更多地宣傳它。 :) – 2011-12-09 11:48:03

2

我已經回答過類似的問題感興趣:SQL Server Process Queue Race Condition。總之,您需要ROWLOCK, READPAST, UPDLOCK提示將表格用作隊列。

但是,您無法使用數據庫引擎鎖「阻止」相同的文件,因爲這意味着在處理文件時保持事務處於打開狀態。你可以做的是「國旗」,因此它被其他進程在安全並行的方式跳過按我上面的鏈接

文件,我其他的答案也可以幫助你https://stackoverflow.com/search?tab=votes&q=user%3a27535%20readpast

+0

我嘗試過使用這些提示,但是當我這樣做的時候它突破了第3點。 – user1085351

+0

請參閱我的第2段:您希望的模式通常是某些客戶端代碼將調用數據庫,獲取有關處理內容,處理它的信息以及回寫。你不保持交易的開放 – gbn