SQL Server 2008:我在这里遇到一种情况,我希望从表中读取并在某些条件下写一行。问题是我不希望另一个请求在同一时间和同样的事情发生。我会在这里解释一下:
表名: RequestQueue
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。我希望该查询在另一页甚至可以从此表读取之前一直运行我没有得到“双排”效果。
我可能需要“锁定”或其他东西,我用谷歌搜索,但没有找到适合我的确切情况的东西。我确信这可能是一个简单的存储过程,我只需要在这里向正确的方向推进。
谢谢,
罗伯特
答案 0 :(得分: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
序列化对特定过程中SELECT/INSERT
代码的访问,而无需使用独占表锁定