2010-12-06 58 views
2

SQL Server 2008:我在這裏有一種情況,我希望從表中讀取並在特定條件下寫入一行。問題是我不希望另一個請求在同一時間完成,並且執行相同的操作。我會試着在這裏解釋:SQL查詢獨佔讀/寫表

表名:請求隊列

Columns: 

RequestID, StartDate, EndDate, RequestResult 

Sample Data 

1, 12/4/10 1:00pm, 12/4/10 1:02pm, Success 
2, 12/4/10 1:04pm, 12/4/10 1:05pm, Success 
3, 12/4/10 1:00pm, NULL, NULL 

當我的應用程序在頁面加載,我希望它看看這個表,如果有一個請求,仍在等待像(ID#3)它不會做任何事情。否則,如果沒有待處理的請求,它會創建一個ID和StartDate填入的新行。

問題是我們可能會遇到兩次幾乎完全同時加載頁面的情況。如果它們碰巧在生成新行之前從表中讀取,那麼我可以在那裏得到兩個新行。我想要從表中讀取某種查詢,並且如果沒有請求掛起,請插入新行並填入StartDate。我希望該查詢在另一個頁面甚至可以從此表中讀取之前一直運行我沒有得到「雙排」的效果。

我可能需要「鎖定」或什麼的,我GOOGLE了,但沒有找到我的確切情況的東西。我相信這可能是一個簡單的存儲過程,我只需要在這裏向正確的方向推動。

感謝,

羅伯特

+1

採取排它鎖時訪問具體的程序內SELECT/INSERT代碼? MySQL,SQL Server等? – JNK 2010-12-06 16:36:45

+1

什麼RDBMS和版本?你是否想要阻止**所有**併發讀取或者是否有一些與插入過程無關的讀取最好被允許? – 2010-12-06 16:37:02

回答

2

假設你只是想阻止你可能只是做表中所有的併發訪問。

BEGIN TRAN 

DECLARE @StartDate datetime, 
     @EndDate datetime 

SELECT TOP 1 
      @StartDate = StartDate, 
      @EndDate = EndDate 
     FROM  RequestQueue WITH(TABLOCK,XLOCK) 
     ORDER BY RequestID DESC 


IF @EndDate IS NULL 
    SELECT @StartDate AS 'StartDate' 
ELSE 
    INSERT INTO RequestQueue (StartDate) 
    OUTPUT INSERTED.* /* Or use SCOPE_IDENTITY() instead*/ 
    VALUES (GETDATE()) 

COMMIT 

或者你可以只連載而不使用sp_getapplock什麼是您使用RDBMS